Как я могу указать целевую платформу при использовании libclang для анализа кода C?

#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(…). Спасибо, Иван Косарев, за предложение этого решения.