LLVM содержит анализ псевдонимов под названием "анализ псевдонимов на основе типа" (передайте исходный код на github), который использует метаданные !tbaa
встроенные в инструкцию. Информация метаданных выглядит так:
!1 = metadata !{metadata !2, metadata !2, i64 0}
!2 = metadata !{metadata !"int", metadata !3, i64 0}
!3 = metadata !{metadata !"omnipotent char", metadata !4, i64 0}
!4 = metadata !{metadata !"Simple C/C++ TBAA"}
Похоже, для этого требуется, чтобы фронтмен как clang генерировал информацию метаданных.
Компиляция файла исходного кода без передачи каких-либо аргументов оптимизации (или -O0
) не может сгенерировать вышеуказанные метаданные. И до сих пор я только обнаружил, что должен пройти, по крайней мере, -O1
чтобы -O1
чтобы получить их; проблема в том, что я не ожидаю, что произойдет другая оптимизация/преобразование (например, instcombine) (проходы, используемые clang -O1
, аналогичны результатам, представленным этим ответом).
Есть ли способ достичь этой цели?
Я не предлагаю его для использования в производстве, но вы можете сделать что-то вроде этого:
clang -cc1 -o 1 -no-struct-path-tbaa -disable-llvm -o ptzns foo.cpp -emit-llvm -o -
чтобы посмотреть метаданные TBAA (удалите -no-struct-path-tbaa, если вы тоже захотите это посмотреть).
В противном случае вы можете легко модифицировать clang, чтобы всегда включать метаданные TBAA.