Совместимость OpenWatcom / VisualStudio в соглашениях о повторных вызовах - PullRequest
0 голосов
/ 20 декабря 2018

Я хотел бы скомпилировать плагин Photoshop Filter с OpenWatcom.Код уже существует и отлично работает с Visual Studio.

Функция выглядит следующим образом:

extern "C" __declspec(export) void PluginMain(short selector, FilterRecordPtr pb, intptr_t *data, short *result);

Она отлично работает в Visual C ++.Обратите внимание, что явно не указано соглашение о вызовах (Adobe не определяет никаких соглашений о вызовах в своих заголовочных файлах SDK).

Хотя это работает в VC ++, в OpenWatcom это не работает, и похоже, что соглашение о вызовахне является правильным.(Я получаю странное поведение, такое как поврежденный стек, даже с функцией HelloWorld).

В Википедии я посмотрел таблицу с соглашениями о вызовах: В таблице написано , что еслисоглашение о вызовах не указано, Watcom помещает параметры в регистры «EAX, EDX, EBX, ECX», стек заполняется справа налево, а вызываемый абонент очищает стек.Но в таблице не указано, что делают компиляторы Microsoft, если не указано соглашение о вызовах.Я действительно думаю, что Visual Studio использует другое соглашение о вызовах по умолчанию.Поэтому я попытался указать __stdcall, __cdecl или __pascal в OpenWatcom, но это не очень помогло.

Один из моих вопросов состоит в том, что именно является соглашением о вызовах по умолчанию в Visual Studio, если ничего не происходит.указано?Что именно поместит в регистры, в каком направлении в стеке, и кто очищает стек?Я нигде не мог найти эту информацию.

Если бы я знал точное поведение, я мог бы использовать функциональность "#pragma aux" в OpenWatcom для обеспечения соблюдения пользовательского соглашения о вызовах?

Или вы знаете что-то еще, я могу попытаться исправить соглашение о вызовах в OpenWatcom?

1 Ответ

0 голосов
/ 20 декабря 2018

(переход от комментария)

Соглашение о вызовах по умолчанию в Visual C ++: cdecl , хотя можно изменить с помощью переключателя командной строки (/Gd,/Gr, /Gv, /Gz) .

Читая, кажется, что у Watcom также есть подобный набор опций - -ecc должен установить для использования cdeclпо умолчанию.

...