Articles of llvm

在一个平台(MacOSX),而不是另一个(Linux)

我在MacOSX(Segmentation fault:11,在gdb“程序接收到的信号SIGSEGV,Segmentation fault”)中收到一个段错误,出现在析构函数中,在这个析构函数中,一个迭代器和内存被删除。 我已经尝试过clang ++,g ++(LLVM的一部分)和homebrew g ++。 迭代器第一次增加时会出现segfault,gdb消息(用clang ++编译) "0x000000010001196d in std::__1::__tree_node_base<void*>* std::__1::__tree_next<std::__1::__tree_node_base<void*>*>(std::__1::__tree_node_base<void*>*) ()" 当在gdb中启动程序的时候,我也会收到警告,提示“warning:Could not open OSO archive file”。 在一个集群linux节点上,用gcc 4.8.1,我没有得到一个段错误。 任何想法可能是错误的,以及如何我可以避免在我的Mac(最好与铛)的段错误? 我真的不太了解编译器等。 编辑: 我想我发现了这个问题,但是我想了解为什么这个工作在一个平台上而不是另一个平台上。 这是一个最小的例子: class级Word: #ifndef WORD_H #define WORD_H #include <string> #include <map> class Word { public: /*** Constructor ***/ Word(std::string w) : m_word(w) { // Add word to index map, […]

使用LLVM传递加载和存储variables

我正在尝试这样做: 1-插入一个variablest1。 2-向chronofunction插入呼叫(获取时间)。 3-在t1中存储计时器的返回值 4-将一个调用插入到“函数”(我写的一个函数)并传递t1作为参数。 函数在t1上进行一些计算。 在代码中是: float t1 = std::chrono::duration_cast<chrono::nanoseconds(chrono_steady_clock::now().time_since_epoch().count()); function(t1); 不过,我想在我想修改的程序中插入上面的LLVM pass。 我不确定如何去做,但我的想法是: Constant *TFunc = M.getOrInsertFunction("std::chrono::duration_cast<chrono::nanoseconds(chrono_steady_clock::now().time_since_epoch().count())", Type::getFloatTy(M.getContext()),NULL); tfunc = cast<Function>(TFunc); for (*certain type of instructions Inst*){ CallInst *CurrInst = dyn_cast<CallInst>(Inst); AllocaInst *Talloc = new AllocaInst(Type::getFloatTy((*Inst).getContext()),"t1"); Instruction *Tcall = CallInst::Create(tfunc,""); StoreInst* store_t = new StoreInst(Tcall,Talloc,(Instruction*)CurrInst); if(storeT != NULL) { LoadInst* loadT = new […]

llvm-ld如何定位libstdc ++

简短的问题 : llvm-ld如何定位libstdc++ ? 详情 : 我收到以下错误信息: llvm-ld: error: Cannot find library 'stdc++' 同时运行llvm-ld 。 我想了解如何llvm-ldsearchlibstdc++ 。 我正在build立一个新的系统,并遵循在不同系统上工作的编译步骤。 最后,我注意到与旧系统上的.bashrc中设置的LD_LIBRARY_PATH不同,后者包含大量目录,包括Cadence和其他杂项软件。 我不想使用LD_LIBRARY_PATH ,我想通过向llvm-ld提供适当的命令行参数来链接到libstdc++ 。 我正在运行的命令是: llvm-ld -disable-internalize -native -o foo foo.bc4 -L/usr/lib/x86_64-linux-gnu -lpthread -lrt -lstdc++ -lm -v 这导致了以下输出: Linking bitcode file 'foo.bc4' Linked in file 'foo.bc4' Linking archive file '/usr/lib/x86_64-linux-gnu/libpthread.a' Linking archive file '/usr/lib/x86_64-linux-gnu/librt.a' llvm-ld: error: Cannot […]

如何把常量放在代码存储器中

我需要在程序中以常数的forms保存一些关于每个函数的信息。 我想知道是否有可能将常量放在代码存储器之前的函数中,所以如果通过函数指针调用某个函数,则可以通过减去函数指针的值来读取该信息。 为了进一步说明,我的代码内存应该如下所示。 ConstantForFunc1 Func1: …. ConstantForFunc2 Func2: …. 以下是我如何阅读这些信息的示例代码 FuncPointer f = &Func2; int constantForFunc2 = *((int*)(f – sizeof(int))); 并注意使用哈希表是太慢,我想要实现,所以我需要一个非常快速的方法。 而所有这些插入常量和代码的修改都是通过一个编译器来完成的,我正在编写这个修改器,并修改了LLVM IR。 编译器通过使用结构将非常麻烦,因为它将不得不修改很多代码。

如何用clang / LLVM库编译C ++代码?

我是Linux的新手,并通过一些clang的教程。 但是,我发现很难编译一个简单的文件。 所以,这是代码的一部分: #include <cstdio> #include <string> #include <iostream> #include <sstream> #include <map> #include <utility> #include "clang/AST/ASTConsumer.h" #include "clang/AST/RecursiveASTVisitor.h" #include "clang/Basic/Diagnostic.h" #include "clang/Basic/FileManager.h" #include "clang/Basic/SourceManager.h" #include "clang/Basic/TargetOptions.h" #include "clang/Basic/TargetInfo.h" #include "clang/Frontend/CompilerInstance.h" #include "clang/Lex/Preprocessor.h" #include "clang/Parse/ParseAST.h" #include "clang/Rewrite/Core/Rewriter.h" #include "clang/Rewrite/Frontend/Rewriters.h" #include "llvm/Support/Host.h" #include "llvm/Support/raw_ostream.h" using namespace clang; using namespace std; 当我试图编译简单的代码(让我们说PrintFunctions.cpp)与以下命令: clang++ -o PrintFunctions PrintFunctions.cpp 我得到的错误: […]

GDB在eclipse中不显示一些值

当我尝试使用Eclipse来显示某些数据结构(包括STL和某些LLVMtypes,如Instruction *)的值时,它只给出地址而不是它们的内容。 我的eclipse与GDB集成在一起。 请帮忙。

怪异的内核locking

基本上,我正忙于从Mach对象文件加载和链接目标代码到Linux内核,我注意到当我从该对象内部执行printk时出现了一些奇怪的现象。 如果我用超过3个(4个或更多)参数( printk("%d,%d,%d \n", 1, 1, 1) ))调用printk("%d,%d,%d \n", 1, 1, 1) ,系统将会locking,但是在某个时间点之后将不会从系统调用返回,而只是locking)。 实际的打印工作,并在所有情况下打印预期值。 现在,奇怪的是, 这只有当我使用Clang + LLVM构build时才会发生 。 这是罪魁祸首的代码: 另一方面,当使用LLVM GCC构build时,它工作得很好: 当使用GNU GCC构build时,这也可以工作: 任何人都可以提出为什么铛版本使系统locking的原因? 所以基本上,第一个代码片段出现了问题,使得它的locking不存在于其他代码中。 我真的不知道什么是错的。

在另一台机器上运行一个由clang + llvm编译的程序

我正在通过clang + llvm(3.1版)编译一个程序,并试图在一台也具有相同的clang + llvm版本的计算机上运行它。 我正在编译Ubuntu 10,但是我试图运行的另一台计算机有CentOS 5.在CentOS中,我也遇到了通过LLVM编译的问题(编译器通道在LLVM中实现)。 这就是为什么我想在Ubuntu上进行编译,从那里取出exe,然后在CentOS机器上运行。 但是,当我尝试这样做时,出现以下错误。 ./main: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by ./main) ./main: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by ./main) 我该如何解决这个问题。 请注意,我没有在该机器上的根访问。

将libc ++链接到Linux上的CMake项目

我想在Arch Linux的CMake项目中使用libc ++和clang。 我安装了libc ++,并在“在您的程序中使用libc ++”的Linux部分中的LLVM站点上提到了CMakeLists.txt的以下行: set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=libc++") set(CMAKE_EXE_LINKER_FLAGS "-lc++abi") 我已经在连接器的标志中试过“++ abi”,但是没有帮助。 我需要一些帮助来弄清楚我应该写在我的CMakeLists.txt中。

如何卸载LLVM?

我从源代码安装LLVM(使用CMake并make install ),但是我无法卸载它,因为没有make uninstall可用。 这是LLVM版本3.5.2。 我使用ArchLinux。 如何以自动方式卸载LLVM?