Мне нужно сделать некоторые манипуляции от источника к источнику в ядре Linux.Я пытался использовать Clang для этой цели, но есть проблема.Clang выполняет предварительную обработку исходного кода, то есть макроса, и включает расширение.Это приводит к тому, что clang иногда создает неработающий код на языке C с точки зрения ядра Linux.Я не могу сохранить все изменения вручную, так как ожидаю иметь тысячи изменений на один файл.
Я пробовал ANTLR, но доступные общедоступные грамматики неполны и не подходят для таких проектов, как ядро Linux.
Поэтому мой вопрос заключается в следующем.Существуют ли способы выполнения манипуляций с исходным кодом для кода C без предварительной обработки?
Итак, предположим следующий код.
#define AAA 1
void f1(int a){
if(a == AAA)
printf("hello");
}
После применения манипуляции от источника к источнику я хочу получить это
#define AAA 1
void f1(int a){
if(functionCall(a == AAA))
printf("hello");
}
Но Clang, например, производит следующий код, который не соответствует моим требованиям, то есть расширяетсямакрос AAA
#define AAA 1
void f1(int a){
if(functionCall(a == 1))
printf("hello");
}
Надеюсь, я был достаточно ясен.
Редактировать
Приведенный выше код является только примером.Манипуляции источник-источник, которые я хочу сделать, не ограничиваются подстановкой операторов if()
, но также вставляют унарный оператор перед выражением, заменяют арифметическое выражение его положительным или отрицательным значением и т. Д.
Решение
Есть одно решение, которое я нашел для себя.Я использую gcc для получения предварительно обработанного исходного кода, а затем применяю Clang.Тогда у меня нет проблем с расширением макросов и включением, так как эта работа выполняется gcc.Спасибо за ответы!