Tag: llvm

计算数组的数量

如何在C程序中计算数组的总数? LLVM IR中的数组声明对应于alloca类型的操作。 所以 int a[10]; 对应于 %a = alloca [10 x i32], align 4 在LLVM IR中。 但我也注意到了 int j = 0; 也对应于alloca指令 %j = alloca i32, align 4 那么如何计算仅对应数组的alloca指令数? 编辑: for (Function::iterator i = F.begin(), e = F.end(); i != e; ++i) { for (BasicBlock::iterator ii =(*i).begin(), ii_e = (*i).end(); ii != ii_e; ++ii) […]

在LLVM中为变量使用特定寄存器

我正在写一个修改LLVM bitcode的LLVM传递。 对于一个变量,我希望它使用寄存器,比如x86上的R15。 如何在生成机器代码时指示LLVM使用此寄存器? 这可以在bitcode级别指导吗?

LLVM和GCC,不同的输出相同的代码

这是一个示例代码,仅用于显示LLVM编译器和GCC的不同输出。 我想知道为什么? 答案应该很简单,但我看不到它。 (Xcode 4.6.1) 代码: #include #define MAX(a,b) ( (a) > (b) ? (a) : (b) ) int increment() { static int i = 42; i += 5; printf(“increment returns %d\n”,i); return i; } int main( int argc, char ** argv ) { int x = 50; printf(“max of %d and %d is %d\n”, […]

Clang,Microsoft链接器和标准库

我已经使用Microsoft C ++成功构建了Clang,并且我正在尝试编译一个hello world测试用例; 它可以生成一个目标文件,链接标准库是剩下的绊脚石: hello-202520.o : error LNK2019: unresolved external symbol _printf referenced in function _main LINK : error LNK2001: unresolved external symbol _mainCRTStartup 前几年有评论称Clang还没有进行Windows链接,但我得到了那些过时的印象,现在它确实能够生成Windows格式的目标文件: clang -c hello.c ren hello.o hello.obj link hello.obj …没有barf,所以文件格式似乎是正确的,但仍然得到未解决的外部符号错误。 可能的猜测是Microsoft编译器标记其输出目标文件,并指示他们需要链接的标准库,而Clang没有,并且眼睛对相应目标文件的hex转储似乎证实了这一点,并给出了一个暗示链接器命令行使用: link /defaultlib:libcmt /defaultlib:oldnames hello.obj 我对这个阶段寄予厚望,但是它仍然给出了同样未解决的外部符号错误。 我还缺少什么?

从LLVM bitcode编译对象时无法链接到静态库。

我正在开发一个LLVM编译器传递。 我通过以下方式运行传递: 编译为LLVM bitcode clang foo.c -emit-llvm -c -o foo.bc 通过opt运行foo.bc(没有此步骤仍会出现错误) 编译回目标文件 clang -c -o foo.o foo.bc 现在foo.o可能是静态库的一部分。 ar rc libfoo.a foo.o 当以这种方式编译所有我的c文件时,我无法链接到libfoo.a。 clang libfoo.a linkme.o -o linkme linkme.o:linkme.bc:function main: error: undefined reference to ‘foo’ clang: error: linker command failed with exit code 1 (use -v to see invocation) 源文件: foo.c的: int foo(int a) { […]

获取LLVM getelementptr的操作数名称

我试图获取getelementptr指令引用的数组的名称。 当数组被索引到实际c代码中使用中间变量时,这似乎有效 int a = 0; i[a] = 3; 在这种情况下,我得到以下bitcode %arrayidx = getelementptr inbounds [2 x i32], [2 x i32]* @i, i64 0, i64 %idxprom store i32 3, i32* %arrayidx, align 4 在这种情况下,我可以迭代getelementptr指令的操作数,并通过第一个操作数上的getName()方法找到数组的名称(i)。 但是,如果在源代码中,数组直接索引, i[0] = 3; 然后,生成的bitcode如下 store i32 3, i32* getelementptr inbounds ([2 x i32], [2 x i32]* @i, i64 0, i64 0), […]

如何使用clang和llvm-link链接库

我正在编译我的程序, clang++ -O4 -emit-llvm file1.cpp -c -o file1.bc -pthread clang++ -O4 -emit-llvm file2.cpp -c -o file2.bc -pthread llvm-link file1.bc file2.bc -o main.ll -S 如何指定与-ldl的链接

它在llvm中相当于size_t

某些系统库(如malloc strlen)需要或返回size_t作为参数。 LLVM IR与这些function交互的正确选择是什么? 选择是编译器的任务吗? LLVM IR是否具有size_t类型?

C LLI与LLVM

我有一个用LLVM编写的编译器,我正在寻求提高我的ABI合规性。 例如,我发现很难在Windows x86或Linux上找到C ABI的规范文档。 我发现的那些用RAX / EAX /等​​解释它,而不是我可以使用的IR术语。 到目前为止,我认为我认为LLVM无形地处理聚合 – 也就是说,它将每个成员视为一个独特的参数。 例如,在Windows x64上,如果我想处理像文档所说的聚合,我需要强制转换为该大小的单个整数,如8,16,32或64位。 否则,通过指针传递。 对于Windows x86,似乎__cdecl和__stdcall不需要我的任何操作,因为所有参数都在堆栈上传递。 __fastcall说前两个32位或更小的参数是寄存器传递的,所以我需要强制大小或更小的聚合。 __thiscall在寄存器中传递它,其余的在堆栈中,所以看起来我不需要在这里执行任何调整。 对于__vectorcall,通过整数强制传递不超过sizeof(void *)的聚合。 对于其他聚合,如果它们是HVA,则按值传递; else在x86上传递值或在x64上传递指针。 这似乎很简单(相对而言),但是sext的LLVM文档明确指出“这表明代码生成器应该将参数或返回值符号扩展到目标的ABI所需的范围(通常为32位) )由调用者(对于参数)或被调用者(对于返回值)。“ x86调用约定的Microsoft页面没有提及任何扩展任何宽度的内容。 我观察到Clang生成的LLVM IR在Windows上生成了byval属性。 我从上面收集到的理解从未要求使用byval 。 如何将各种平台C ABI降低到LLVM IR?

Libclang API用于获取在不同文件中定义的函数定义

假设我有两个文件main.c和func.c func.c是从main.c的main函数调用的。 通常,我会生成main.o和func.o,链接器会找到func的定义并将其绑定到main .c中的调用。 现在,我想通过libclang API做同样的事情。 这是我正在制作的Doxygen类型代码浏览实用程序。 我能够解析这两个文件。 从这里开始,我不知道如何继续。 我应该生成* .o文件并让clang链接吗? 谢谢,我希望我能清楚地提出这个问题