2016-01-03 2 views
5

В настоящее время я работаю над инструментом, который идентифицирует загрузки и хранения доступа к глобальным и переменным поля в произвольных программах. Кроме того, доступные переменные должны быть идентифицированы по именам/идентификаторам исходного уровня. Для этого я скомпилирую исходный код программы под диагностикой в ​​LLVM IR с информацией об отладке. Пока что так хорошо, генерируемые узлы метаданных содержат требуемые идентификаторы уровня источника. Тем не менее, я не могу подключить некоторые ИЛ-идентификаторы LLVM и информацию в метаданных.LLVM IR: идентификация переменных с узлами метаданных

Для примера рассмотрим SATIC член класса:

class TestClass { 
    public: 
    static int Number; 
}; 

Соответствующий LLVM IR выглядит следующим образом:

@_ZN12TestClass6NumberE = external global i32, align 4 

... 
!15 = !DIDerivedType(tag: DW_TAG_member, name: "Number", scope: !"_ZTS12TestClass", file: !12, line: 5, baseType: !16, flags: DIFlagPublic | DIFlagStaticMember) 

В этом контролируемом примере я знаю, что "@ _ZN12TestClass6NumberE" является идентификатор для «Номер». Однако, в общем, я не вижу, как я могу узнать, какие IR-идентификаторы соответствуют тем метаданным.

Может ли кто-нибудь помочь мне?

ответ

1

Поскольку никто, кажется, не имеет хорошего решения моей проблемы, я расскажу о своем собственном неудобном подходе к решению этой проблемы. Созданные LLVM узлы MetaData содержат информацию о определенных типах и переменных кода. Однако нет информации о том, какие генерируемые IR-переменные соответствуют тем переменным исходного кода. LLVM просто связывает информацию метаданных IR-инструкций с соответствующими исходными местоположениями (строками и столбцами). Это имеет смысл, поскольку основной задачей метаданных LLVM является не анализ, а отладка.

По-прежнему содержащаяся информация не бесполезна. Мое решение этих проблем - использовать clang AST для анализа исходного кода. Здесь мы получаем информацию о том, к какой переменной обращаются, в каком месте источника. Таким образом, для получения информации об идентификаторах исходной переменной во время LLVM IR-инструментария нам просто нужно сопоставить исходные местоположения с идентификаторами исходных переменных во время анализа анализа clang AST. В качестве второго шага мы выполняем ИК-приборы, используя нашу ранее собранную информацию. Когда мы сталкиваемся с инструкцией store или load в IR, мы выполняем поиск в узле метаданных этой команды для соответствующего местоположения источника. Поскольку мы сопоставили местоположения источников с идентификаторами исходных переменных, теперь мы можем легко получить доступ к идентификатору исходной переменной инструкции IR.

Итак, почему я не просто использую clang AST для идентификации магазинов и нагрузок на переменные? Потому что отличное чтение и запись в AST - непростая задача. AST может легко сказать вам, что переменная доступна, но зависит от того, читается или записывается ли доступная переменная. Поэтому я должен был бы рассмотреть каждую операцию/оператор, чтобы определить, записана ли переменная или прочитана, или и то, и другое. В этом отношении LLVM намного проще, более низкоуровневым и, как следствие, менее подвержен ошибкам. Более того, фактическая аппаратура (вставка кода речи) намного сложнее в АСТ, чем в LLVM. Из-за этих двух причин я считаю, что комбинация аппаратов Clang AST и LLVM IR - лучшее решение для моей проблемы.

Смежные вопросы