函数是这样创建的:
llvm::FunctionType* FunctionTypePtr = llvm::FunctionType::get( returnTypePtr , types , false );
llvm::Function* llvmFunction = llvm::Function::Create(FunctionTypePtr,
llvm::GlobalValue::ExternalLinkage,
functionName,
llvmModule);
Run Code Online (Sandbox Code Playgroud)
然后通过向块添加指令来创建函数体:
llvm::BasicBlock* entryBlock = llvm::BasicBlock::Create(llvmContext, "", llvmFunction);
llvm::IRBuilder<> builder(entryBlock);
Run Code Online (Sandbox Code Playgroud)
现在有了足够的上下文问题:我想为函数参数值添加加载指令,例如:
//where do i get address??
llvm::LoadInst* load = builder.CreateLoad(address, "read");
Run Code Online (Sandbox Code Playgroud)
我不知道如何/在哪里获取address函数参数的变量.
我正在编写 LLVM IR 代码,我可以调用另一个 .ll 文件中的函数吗?
例如:在.ll文件中,有一个函数foo(); 我可以在 b.ll 中使用这个函数,就像调用 foo 一样吗?如果是这样,我怎样才能包括a.ll
谢谢
手册页opt说:“它将 LLVM 源文件作为输入,运行指定的优化或分析,然后输出优化的文件或分析结果”。
我的目标:要使用内置的优化过程-dce中可用opt。这个通行证Dead Code Elimination
我的源文件foo.c:
int foo(void)
{
int a = 24;
int b = 25; /* Assignment to dead variable -- dead code */
int c;
c = a * 4;
return c;
}
Run Code Online (Sandbox Code Playgroud)
这是我所做的:
1. clang-7.0 -S -emit-llvm foo.c -o foo.ll
2.opt -dce -S foo.ll -o fooOpt.ll
我期望的是:一个 .ll 文件,其中消除了死代码(在带有注释的源代码中)部分。
我得到的是:fooOpt.ll 与非优化代码 foo.ll 相同
我已经看过这个SO 答案,但我没有得到优化的代码。
我在这里错过了什么吗?有人可以指导我走正确的道路。
谢谢你。
我需要检查我的文件中的函数 A 是否正在调用函数 B。我当前的方法是遍历函数 A 中的所有指令,看看是否有任何调用/调用指令正在调用 B。有人能建议更好的方法吗?
我正在使用 LLVM 7,并且我llvm::Module想使用标准优化管道对其进行优化。不幸的是,没有llvm::runDefaultOptimizations我可以调用的函数。似乎有无数种方法可以优化 LLVM 中的模块。我在这个主题上的搜索发现了许多旧的/折旧的 API 和一些在我的系统上不起作用的示例。
我想以-O3尽可能少的麻烦来运行所有标准优化。我不想手动列出所有的通行证,甚至不想写一个 for 循环。我认为llvm::PassBuilder::buildModuleOptimizationPipeline可能是解决方案,但是当我尝试使用该函数时出现链接器错误,我认为这很奇怪。
我目前正在使用 LLVM 构建 JIT。structs我希望能够在我的 JIT IR 中使用一些 C 语言。其中之一具有以下布局:
struct myStruct {
int depth;
myStruct* parent;
}
Run Code Online (Sandbox Code Playgroud)
当使用 进行编译clang和使用时-S -emit-llvm,我得到以下结果,这似乎绝对合理:
type myStruct = { i32, myStruct* }
Run Code Online (Sandbox Code Playgroud)
好吧。现在,如果我想使用 LLVM API 执行相同的操作,我不太确定应该如何执行。以下(预期)不起作用:
auto intType = IntegerType::get(context, 32); // 32 bits integer
Type* myStructPtrType = nullptr; // Pointer to myStruct
// The following crashes because myStructPtrType is null:
auto myStructType = StructType::create(context, { intType, myStructPtrType }, "myStruct"); // myStruct
myStructPtrType = PointerType::get(myStructType, 0); // Initialise the …Run Code Online (Sandbox Code Playgroud) 我想链接我的 cmake C++ 项目中的所有 LLVM 库。
我用来llvm-config --components获取 LLVM 的所有组件,它给了我:
$ llvm-config --components
aarch64 aarch64asmparser aarch64codegen aarch64desc aarch64disassembler aarch64info aarch64utils aggressiveinstcombine all all-targets amdgpu amdgpuasmparser amdgpucodegen amdgpudesc amdgpudisassembler amdgpuinfo amdgpuutils analysis arm armasmparser armcodegen armdesc armdisassembler arminfo armutils asmparser asmprinter binaryformat bitreader bitstreamreader bitwriter bpf bpfasmparser bpfcodegen bpfdesc bpfdisassembler bpfinfo cfguard codegen core coroutines coverage debuginfocodeview debuginfodwarf debuginfogsym debuginfomsf debuginfopdb demangle dlltooldriver dwarflinker engine executionengine frontendopenmp fuzzmutate globalisel hexagon hexagonasmparser hexagoncodegen hexagondesc hexagondisassembler hexagoninfo instcombine instrumentation interpreter ipo …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个简单的解释器。
我正在尝试生成 LLVM IR 进行赋值操作。生成部分的代码如下所示
llvm::Value* codeGenSymTab(llvm::LLVMContext& context) {
printf("\n CodeGen SymTab \n");
Value *num = ConstantInt::get(Type::getInt64Ty(context), aTable.value, true);
Value *alloc = new AllocaInst(IntegerType::get(context, 32), aTable.variableName,entry);
StoreInst *ptr = new StoreInst(num,alloc,false,entry);
}
Run Code Online (Sandbox Code Playgroud)
SymTab 定义如下:
struct SymTab {
char* variableName;
int value;
llvm::Value* (*codeGen)(llvm::LLVMContext& context);
};
Run Code Online (Sandbox Code Playgroud)
当我尝试执行输出文件时,出现以下错误:
Assertion failed: (getOperand(0)->getType() == cast<PointerType>(getOperand(1)->getType())->getElementType() && "Ptr must be a pointer to Val type!"), function AssertOK, file Instructions.cpp, line 1084.
Abort trap: 6
Run Code Online (Sandbox Code Playgroud)
你能帮我解决吗?
谢谢
我使用 clang++ 3.4 将 C++11 程序 (test.cpp) 编译为 LLVM IR 文件 (test.ll)。该程序包含多个 C++ lambda 函数,我想知道是否可以使用如下技术仅提取 lambda 函数的 IR:
Module *mod = ParseIRFile("test.ll", *err, ctx);
for (Module::iterator f = mod->begin(); f != mod->end(); ++f) {
//is there some function like isLambdaFunction()?
if (f->isLambdaFunction()) {
cout << "Lambda Function" << endl;
}
}
Run Code Online (Sandbox Code Playgroud) 我正在学习 LLVM 基础知识。我正在尝试进入构建器框架并设置模块、函数头等,但我还无法找到在构建器中创建这样的简单序列的方法:
%0 = 41
%1 = add i32 42, %0
Run Code Online (Sandbox Code Playgroud)
这意味着我如何通过构建器框架使用伪寄存器表示法?
我尝试根据两个常量创建一条加指令。我用来生成(整数)加法的核心行是:
Value *L = (Value *)m_left->Create_LLVM( );
Value *R = (Value *)m_right->Create_LLVM();
if ( L == 0 || R == 0 ) return 0;
llvm::Value *p_instruction = Get_Builder().CreateAdd( L, R, "addtmp" );
Run Code Online (Sandbox Code Playgroud)
这包含很多我自己的功能,但我想基础知识很清楚。我获得左操作数和右操作数的值指针,它们都是常量,然后使用构建器框架创建添加操作。模块和构建器再次正确设置,当我调用 dump() 时,我看到我所做的所有其他内容,但上面的这一行不会创建任何 IR 代码。
我希望它能共同创造类似的东西
%4 = add i32 %3, %2
Run Code Online (Sandbox Code Playgroud)
或类似的东西。我是否误解了与构建器一起构建操作的基本方式,或者只是对某些细节的一些小疏忽?
谢谢