Как сохранить дерево в промежуточном представлении 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, который я написал. Возможно, что-то подобное подойдет вам.

Другие вопросы по тегам