Совместимость OpenWatcom / VisualStudio в соглашениях о повторных вызовах
Я хотел бы скомпилировать плагин 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 ответ
(переход от комментария)
Соглашение о вызовах по умолчанию в Visual C++ - cdecl, хотя его можно изменить с помощью переключателя командной строки ( /Gd
, /Gr
, /Gv
, /Gz
)
Читая вокруг, кажется, что у Watcom есть аналогичный набор опций - -ecc
следует установить его для использования cdecl
по умолчанию.