#gcc #libclang
#gcc #libclang
Вопрос:
Я использую инструмент анализа исходного кода с использованием Clang (версия 6.0.1). Исходный код, который я хочу проанализировать, был написан для процессора ARM и будет скомпилирован с использованием arm-none-eabi-gcc. Мой инструмент работает в Linux или Windows. Как я могу сказать libclang проанализировать этот код для целевой платформы, а не для хост-платформы?
При вызове clang_indexSourceFile(…) для анализа исходного кода я даю ему те же параметры -D и -I, которые я использую для arm-none-eabi-gcc, включая параметры, которые неявно добавляются arm-none-eabi-gcc. Их можно получить, выполнив следующую команду:
arm-none-eabi-gcc -v -dM -E - </dev/null
Я также передаю эти флаги ARM_specific как в arm-none-eabi-gcc, так и в clang_indexSourceFile(…): -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard
Тем не менее, libclang использует встроенные размеры типов, соответствующие хост-платформе (Linux или Windows), а не целевой платформе (Arm). Один из способов проверить это — следующий, по общему признанию, несколько надуманный код:
int c = 1;
switch (c) {
case sizeof(long double): return 1;
case 16: return 2;
default: return 0;
}
Когда я анализирую этот код с помощью libclang, я получаю диагностическое «Повторяющееся значение регистра ’16′», доказывающее, что предполагается, что long double равен 16 байтам. С помощью arm-none-eabi-gcc я не получаю эту ошибку (но я получаю аналогичную ошибку при замене 16 на 8).
Ответ №1:
Используйте -target arm-none-eabi в качестве опции в вызове clang_indexSourceFile(…). Спасибо, Иван Косарев, за предложение этого решения.