LLVM 允许多条指令合而为一吗?
Does LLVM allow multiple instructions in one?
我习惯了 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
何时可以是子表达式是否有规则?
这是一个所谓的“常量表达式”的例子,它不是指令。可以在 LLVM IR 语言参考中找到更多信息:https://llvm.org/docs/LangRef.html#constant-expressions
我习惯了 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
何时可以是子表达式是否有规则?
这是一个所谓的“常量表达式”的例子,它不是指令。可以在 LLVM IR 语言参考中找到更多信息:https://llvm.org/docs/LangRef.html#constant-expressions