【发布时间】:2021-12-26 00:11:56
【问题描述】:
我习惯于认为 LLVM 类似于汇编语言,因为指令是按顺序写出的,每行一个,即不像高级语言那样允许嵌套子表达式,在单个指令中指定任意数量的计算行。
然后我注意到Clang编译了这行C
printf("test\n");
进入这行 LLVM 程序集
%6 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @"??_C@_05FPMBMOMC@test?6?$AA@", i64 0, i64 0))
让我感到困惑的是getelementptr 被写为call 的子表达式。我本来希望它是前一行的单独指令。
我在这些说明中的任何一个的文档中都找不到任何内容,或者一般来说,提到这是允许的。
这里的规则是什么?一般允许子表达式吗?还是getelementptr 是个例外? getelementptr 何时可以是子表达式是否有规定?
【问题讨论】:
-
既有 GEP 常量表达式(接受常量参数)和指令(也可以接受变量)。你看到的是一个常数。
-
@arnt 啊,酷。其他运算符也可以用作常量表达式(如果只给出常量参数),还是 GEP 在这方面是独一无二的?
-
我发现了一个讨论,它揭示了常量表达式背后的推理:lists.llvm.org/pipermail/llvm-dev/2017-March/111247.html
-
可以做很多其他事情,参见 ConstantExpr 类。