我使用哪个LLVM-IR函数属性(如果有的话)来保证函数只读取/写入自己的堆栈帧?

我使用哪个LLVM-IR函数属性(如果有的话)来保证函数只读取/写入自己的堆栈帧?,llvm,llvm-ir,Llvm,Llvm Ir,查看,我无法解析出如何使用函数属性向LLVM承诺函数将alloca自身的堆栈帧并对该堆栈帧进行变异,但不会读取或写入任何其他内存。我想这就是“不可接近”的意思 该函数只能访问正在编译的模块无法访问的内存 但我不确定。从一个低层次的角度来看,堆栈在任何地方都可以访问,因为其他函数可能alloca相同的内存,但从另一个稍微抽象的角度来看,函数的alloca'd区域除了通过alloca返回的指针之外是不可访问的,在我的例子中,它不会传递给下游函数 那么,与使用insertvalue的无堆栈版本相比,的

查看,我无法解析出如何使用函数属性向LLVM承诺函数将
alloca
自身的堆栈帧并对该堆栈帧进行变异,但不会读取或写入任何其他内存。我想这就是“不可接近”的意思

该函数只能访问正在编译的模块无法访问的内存

但我不确定。从一个低层次的角度来看,堆栈在任何地方都可以访问,因为其他函数可能
alloca
相同的内存,但从另一个稍微抽象的角度来看,函数的
alloca
'd区域除了通过
alloca
返回的指针之外是不可访问的,在我的例子中,它不会传递给下游函数

那么,与使用
insertvalue
的无堆栈版本相比,
的以下合法使用是否是不可访问的
,忽略了其明显的低效性

define { i64, i32 } @foo ({ i64, i32 } %bar, i32 %baz) inaccessiblememonly {
  ;; save bar to the stack
  %bar-save = alloca { i64, i32 }
  store { i64, i32 } %bar, { i64, i32 }* %bar-save
  
  ;; overwrite its second field with baz
  %bar-second = getelementptr { i64, i32 }, { i64, i32 }* %bar-save, i32 0, i32 1
  store i32 %baz, i32* %bar-second

  ;; return the modified struct
  %bar-val = load { i64, i32 }, { i64, i32 }* %bar-save
  ret { i64, i32 } %bar-val
}