Как сохранить дерево в промежуточном представлении gcc? Является ли это возможным?
Я хочу сохранить дерево (в частности, тип дерева) в файле в двоичном виде, и мне нужно загрузить это дерево в другой модуль компиляции. Например:
У меня есть main.c с 2 функциями:
myTypeStruct getWhatever(){
myTypeStruct my;
... doSomething ...
return my;
}
int main(){
myTypeStruct my = getWhatever();
... doSomething else with my...
}
и я хочу сохранить тип структуры (myTypeStruct) и загрузить его в другой модуль компиляции, включающий test.c, как:
int main(){
... doSomeTest ...
}
С помощью плагина gcc я хочу загрузить тип и создать переменную этого типа для преобразования test.c во что-то вроде:
int main(){
myTypeStruct my;
... doSomething with my...
... doSomeTest ...
}
Я знаю, что дерево - это указатель на tree_node, а tree_node - это объединение структур. Проблема в том, что дерево имеет с ним связь и с рядом неразборчивых структур. Мне нужно знать, какие данные нужны дерево при создании переменной определенного типа.
PD: Недостаточно документации о том, как LTO делает подобные вещи. PD2: извините за мой английский
1 ответ
Если я правильно понимаю, то, что вы хотите сделать, это сериализовать тип, а затем, при последующей компиляции, прочитать его при помощи вашего плагина, чтобы выполнить какое-то другое преобразование.
Для этого нет встроенной поддержки.
Возможно, это можно сделать с помощью встроенной поддержки предварительно скомпилированных заголовков. Основная идея заключается в загрузке PCH в компиляции, которая вызывает ваш плагин. Таким образом, вы можете сделать так, чтобы PCH содержал типы, которые вы хотите перечитать, и тогда ваш плагин мог просто искать типы по имени.
Использование LTO заманчиво, потому что у него есть вся поддержка потоковой передачи, но я думаю, что код LTO в настоящее время не очень пригоден для использования.
Другой подход - написать собственный сериализатор. Я сделал это для экспериментального плагина PCH, который я написал. Возможно, что-то подобное подойдет вам.