我正在开发一些与llvm字节码文件一起使用的C / C ++ / Objective C静态分析实用程序。它的基本思想很简单:
1.实用程序使用参数“-c -emit-llvm -femit-all-decls -g”执行clang / clang ++,为测试的源文件生成llvm字节码文件。
2.如果创建了文件,则由LLVM C绑定读取并检查。由于存在具有源引用的调试元数据,因此使用源引用报告与某些特定代码点相关的问题。
我的实用程序的原型工作正常,但最近我将Xcode更新为6.1并且缺少源代码引用。
为了解决这个问题,我尝试用更新的编译器重建我的工具和llvm静态库,但它没有解决我的问题。
我试图从llvm收到任何提示,我唯一得到的是:
➜bin./llvm-dis test.bc
警告:忽略test.bc中无效版本(600054001)的调试信息
所以llvm-dis向我展示了警告并生成了test.ll文件,该文件被删除了任何调试元数据属性。
这是我正在玩的简单测试源文件:
int returnFive() {
return 5;
}
以及一些可能有用的信息:
➜bin clang --version
Apple LLVM 6.0版(clang-600.0.54)(基于LLVM 3.5svn)
目标:x86_64-apple-darwin14.0.0
螺纹型号:posix
➜bin./llvm-config --version
3.5.0
➜bin./llvm-config --host-target
x86_64的-苹果darwin14.0.0
对我而言,这似乎非常兼容,但事实并非如此,也许有人可以就如何解决这个问题给我任何建议?
答案 0 :(得分:0)
虽然我仍然不熟悉该解决方案,但我已经破解了LLVM代码并从llvm::UpgradeDebugInfo代码中移除了对BitcodeReader::MaterializeModule方法的调用。当然,如果使用一些真正不兼容的LLVM编译器,我可能会受到惩罚,但是现在它可以使用,此外不仅可以使用来自XCode的clang,而且我也可以使用来自LLVM release page的Clang "使用无效版本(0)和#34;调试信息。