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