Как сохранить идентификаторы элементов структуры при компиляции в LLVM IR с помощью Clang?

Скажем, у меня есть следующее определение структуры C:

struct stringStructure
{
    char *stringVariable;
};

Для вышеизложенного Clang создает следующий LLVM IR:

%struct.stringStructure = type { i8* }

... которое включает в себя все в моем определении, кроме идентификатора переменной stringVariable.

Я хотел бы найти способ экспортировать идентификатор в сгенерированный LLVM IR, чтобы я мог ссылаться на него по имени из своего приложения (которое использует API LLVM C++).

Я попытался добавить атрибут annotate следующим образом:

    char *stringVariable __attribute__((annotate("stringVariable")));

... но аннотация, похоже, не проходит (структура по-прежнему определяется как type { i8* }).

Любые идеи?


person smokris    schedule 07.02.2011    source источник


Ответы (1)


LLVM IR не сохраняет многих особенностей исходного языка. Вы можете проверить это с помощью кода, например

struct Foo {
   char *a;
};

struct Bar {
   char *a;
};

Всего будет сгенерирован только один тип, поскольку типы в LLVM структурно эквивалентны. Если вы хотите сохранить произвольную информацию о конструкциях вашего исходного кода, вы должны выдавать/использовать отладочную информацию.

person Anton Korobeynikov    schedule 07.02.2011
comment
Спасибо, Антон. Мне любопытно, есть ли способы сделать это без выдачи отладочной информации (т.е. в рабочем, оптимизированном, лишенном кода). - person smokris; 07.02.2011
comment
Что ж, вы можете попробовать использовать метаданные для таких целей. Только не думайте, что вы можете сохранить такую ​​информацию внутри IR-элементов LLVM. - person Anton Korobeynikov; 08.02.2011