llvm opt-始终在线传递不';t内联

llvm opt-始终在线传递不';t内联,llvm,inline,Llvm,Inline,我在(人类可读的)LLVM位代码文件Input.ll中有以下SyS_sendto函数定义: ; Function Attrs: alwaysinline noredzone nounwind define i64 @SyS_sendto( i64 %fd, i64 %buff, i64 %len, i64 %flags, i64 %addr, i64 %addr_len) #0 { 在这个文件的末尾,attributes#0包含单词alwaysinline: attributes #0 = {

我在(人类可读的)LLVM位代码文件Input.ll中有以下SyS_sendto函数定义:

; Function Attrs: alwaysinline noredzone nounwind
define i64 @SyS_sendto(
i64 %fd, i64 %buff, i64 %len, i64 %flags, i64 %addr, i64 %addr_len) #0 {
在这个文件的末尾,attributes#0包含单词alwaysinline

attributes #0 = { alwaysinline noredzone nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
; Function Attrs: noredzone nounwind
define i64 @GO(i64 %fd, i64 %buff, i64 %len, i64 %flags) #0 {
  %1 = trunc i64 %fd to i32
  %2 = inttoptr i64 %buff to i8*
  %3 = trunc i64 %flags to i32
  %4 = tail call i64 bitcast
  (i64 (i64, i64, i64, i64, i64, i64)*
      @SyS_sendto to i64
          (i32, i8*, i64, i32, %struct.sockaddr*, i32)*)
          (i32 %1,
           i8* %2,
           i64 %len,
           i32 %3,
           %struct.sockaddr* null,
           i32 0) #0
  ret i64 %4
}
在Input.ll的某个地方,有一个对SyS_sendto的调用,应该是内联的 在选择过程中-始终在线

attributes #0 = { alwaysinline noredzone nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
; Function Attrs: noredzone nounwind
define i64 @GO(i64 %fd, i64 %buff, i64 %len, i64 %flags) #0 {
  %1 = trunc i64 %fd to i32
  %2 = inttoptr i64 %buff to i8*
  %3 = trunc i64 %flags to i32
  %4 = tail call i64 bitcast
  (i64 (i64, i64, i64, i64, i64, i64)*
      @SyS_sendto to i64
          (i32, i8*, i64, i32, %struct.sockaddr*, i32)*)
          (i32 %1,
           i8* %2,
           i64 %len,
           i32 %3,
           %struct.sockaddr* null,
           i32 0) #0
  ret i64 %4
}
我运行:

llvm-as -o=Input.bc Input.ll
opt -always-inline Input.bc -o InlinedInput.bc
llvm-dis -o=InlinedInput.ll InlinedInput.bc
但是GO没有改变,我也看到了InputInlined.ll中对SyS_sendto的调用。。。它是而不是内联的:

; Function Attrs: noredzone nounwind
define i64 @GO(i64 %fd, i64 %buff, i64 %len, i64 %flags) #0 {
  %1 = trunc i64 %fd to i32
  %2 = inttoptr i64 %buff to i8*
  %3 = trunc i64 %flags to i32
  %4 = tail call i64 bitcast
  (i64 (i64, i64, i64, i64, i64, i64)*
      @SyS_sendto to i64
          (i32, i8*, i64, i32, %struct.sockaddr*, i32)*)
          (i32 %1,
           i8* %2,
           i64 %len,
           i32 %3,
           %struct.sockaddr* null,
           i32 0) #0
  ret i64 %4
}

非常感谢您的帮助!谢谢

在您的示例中,对
@SyS\u sendto
的调用是一个间接调用的实例(由于
比特广播
表达式),LLVM当前正在内联这些调用


您可以遵循(2015)或签入。

在您的示例中,对
@SyS\u sendto
的调用是间接调用的一个实例(由于
比特广播
表达式),LLVM当前正在内联这些调用

您可以关注(2015)或登记入住