commit d23dfdeab9358f0f026990e4d0f1da0ddaa6b177 (tree)
parent e3e4af727103d90cb191f130159928d237263e1f
Author: Koakuma <koachan@protonmail.com>
Date: Fri, 5 Feb 2021 00:25:01 +0700
Add comment explaining the alignment setting
Diffstat:
1 file changed, 6 insertions(+), 0 deletions(-)
diff --git a/src/stage1/codegen.cpp b/src/stage1/codegen.cpp
@@ -4161,6 +4161,12 @@ static LLVMValueRef gen_frame_size(CodeGen *g, LLVMValueRef fn_val) {
LLVMValueRef negative_one = LLVMConstInt(LLVMInt32Type(), -1, true);
LLVMValueRef prefix_ptr = LLVMBuildInBoundsGEP(g->builder, casted_fn_val, &negative_one, 1, "");
LLVMValueRef load_inst = LLVMBuildLoad(g->builder, prefix_ptr, "");
+
+ // Some architectures (e.g SPARCv9) has different alignment requirements between a
+ // function/usize pointer and also require all loads to be aligned.
+ // On those architectures, not explicitly setting the alignment will lead into @frameSize
+ // generating usize-aligned load instruction that could crash if the function pointer
+ // happens to be not usize-aligned.
LLVMSetAlignment(load_inst, 1);
return load_inst;
}