我正在尝试通过C ++ API在llvm中实现嵌套函数。在我执行语义检查(以确保将要编译的程序具有正确的嵌套引用等)之后,我在llvm中定义相同范围内的所有函数,并将所有变量设置为全局。我期待这个工作,但我发现自己在使用以下命令从.o文件获取可执行文件时遇到了很大的问题:
"llvm-as-3.8 output.ll| llc-3.8 -filetype=obj | clang-3.8 ../library/library.a -v -o out"
通过对全局变量使用llvm::GlobalValue::WeakAnyLinkage
或llvm::GlobalValue::ExternalLinkage
链接,我得到:
/ usr / bin / ld:/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info):重定位0具有无效的符号索引11
/ usr / bin / ld:/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info):重定位1具有无效符号索引12
/ usr / bin / ld:/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info):重定位8具有无效的符号索引12
...
/ usr / bin / ld:/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_line):重定位0具有无效符号索引2
/ usr / bin /../ lib / gcc / x86_64-linux-gnu / 4.8 /../../../ x86_64-linux-gnu / crt1.o:在函数`_start'中:
(。text + 0x20):对'main'的未定义引用
这似乎与main的定义有关,我在ir代码的定义中代表:
; Function Attrs: nounwind uwtable
define void @main() #0 {
事情是,当我不使用全局变量时,相同的命令没有任何问题,当然在子函数中使用变量的情况,这是我试图将alloca更改为全局的原因
帮助找到解决此问题的方法。 提前致谢。 注1:我使用llvm-3.8
更新: 当我从clang命令中删除-v时,结果为:
refined_output.o:在函数
bsort': refined_output.ll:(.text+0x4): undefined reference to
x'中 refined_output.ll :(。text + 0xa):对n' refined_output.ll:(.text+0x10): undefined reference to
的未定义引用已更改' refined_output.ll :(。text + 0x22):对i' refined_output.ll:(.text+0x2c): undefined reference to
的未定义引用已更改' refined_output.ll :(。text + 0x42):对i' refined_output.ll:(.text+0x48): undefined reference to
n'的未定义引用 refined_output.ll :(。text + 0x50):对i' refined_output.ll:(.text+0x59): undefined reference to
x'的未定义引用 refined_output.ll :(。text + 0x60):对i' refined_output.ll:(.text+0x75): undefined reference to
x'的未定义引用 refined_output.ll :(。text + 0x7c):对i' refined_output.ll:(.text+0x95): undefined reference to
的未定义引用已更改' refined_output.ll :(。text + 0xa3):对changed' refined_output.o: In function
swap'的未定义引用: refined_output.ll :(。text + 0xc3):对x.1' refined_output.ll:(.text+0xca): undefined reference to
y'的未定义引用 refined_output.ll :(。text + 0xd1):对x.1' refined_output.ll:(.text+0xd9): undefined reference to
t'的未定义引用 refined_output.ll :(。text + 0xe0):对x.1' refined_output.ll:(.text+0xe7): undefined reference to
y'的未定义引用 refined_output.ll :(。text + 0xf2):对y' refined_output.ll:(.text+0xf8): undefined reference to
t'的未定义引用 refined_output.o:在函数main': refined_output.ll:(.text+0x102): undefined reference to
i.4' refined_output.ll :(。text + 0x10c):对seed' refined_output.ll:(.text+0x123): undefined reference to
x.2'的未定义引用 refined_output.ll :(。text + 0x12a):对i.4' refined_output.ll:(.text+0x130): undefined reference to
种子'的未定义引用 refined_output.ll :(。text + 0x15d):未定义引用seed' refined_output.ll:(.text+0x166): undefined reference to
i.4' refined_output.ll :(。text + 0x16c):对i.4' refined_output.ll:(.text+0x177): undefined reference to
x.2'的未定义引用 refined_output.ll :(。text + 0x18d):对x.2' refined_output.ll:(.text+0x19e): undefined reference to
x.2'的未定义引用 refined_output.o:在函数printArray': refined_output.ll:(.text+0x1c4): undefined reference to
msg'中 refined_output.ll :(。text + 0x1cb):未定义引用x.2' refined_output.ll:(.text+0x1d1): undefined reference to
n.3' refined_output.ll :(。text + 0x1d8):未定义引用msg' refined_output.ll:(.text+0x1e3): undefined reference to
i.4' refined_output.ll :(。text + 0x1f3):未定义引用x.2' refined_output.ll:(.text+0x1fa): undefined reference to
i.4' refined_output.ll :(。text + 0x208):未定义引用i.4' refined_output.ll:(.text+0x20e): undefined reference to
i.4' refined_output.ll :(。text + 0x214):未定义引用n.3' refined_output.ll:(.text+0x21c): undefined reference to
i.4'clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)
所有这些变量都是在我的程序开始时在llvm IR中定义的:
@x = external global i32*
@n = external global i32
@i = external global i32
@changed = external global i1
@x.1 = external global i32*
@y = external global i32*
@t = external global i32
@msg = external global i8*
@x.2 = external global i32*
@n.3 = external global i32
@i.4 = external global i32
@const_string_temp = private constant [3 x i8] c", \00", align 1
@const_string_temp.5 = private constant [2 x i8] c"\0A\00", align 1
@i.6 = external global i32
@x.7 = external global i32
@seed = external global i32
@const_string_temp.8 = private constant [16 x i8] c"Initial array: \00", align 1
@const_string_temp.9 = private constant [15 x i8] c"Sorted array: \00", align 1
我希望这有助于您帮助我 - 或者在我的IR代码生成中找到问题。
我很期待..
答案 0 :(得分:2)
@x = external global i32*
等等是全局变量声明,而不是定义。因此,“未定义的引用”错误是有效的,您确实需要定义它们。
有关详细信息,请参阅http://llvm.org/docs/LangRef.html#global-variables
还要注意llvm-as / llc部分是多余的 - clang可以编译.ll / .bc文件就好了。