From 093ffe9f161f604d7742afc0012c7c8f8437316d Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Fri, 20 Sep 2019 16:39:18 +0200 Subject: [PATCH] Correct stack alignment for new stack --- src/codegen.cpp | 3 ++- src/zig_llvm.cpp | 4 ++++ src/zig_llvm.h | 2 ++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/codegen.cpp b/src/codegen.cpp index 614b8381c5..951ca97a4b 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -3706,7 +3706,8 @@ static LLVMValueRef get_new_stack_addr(CodeGen *g, LLVMValueRef new_stack) { LLVMValueRef ptr_addr = LLVMBuildPtrToInt(g->builder, ptr_value, LLVMTypeOf(len_value), ""); LLVMValueRef end_addr = LLVMBuildNUWAdd(g->builder, ptr_addr, len_value, ""); - LLVMValueRef align_amt = LLVMConstInt(LLVMTypeOf(end_addr), get_abi_alignment(g, g->builtin_types.entry_usize), false); + const unsigned alignment_factor = ZigLLVMDataLayoutGetStackAlignment(g->target_data_ref); + LLVMValueRef align_amt = LLVMConstInt(LLVMTypeOf(end_addr), alignment_factor, false); LLVMValueRef align_adj = LLVMBuildURem(g->builder, end_addr, align_amt, ""); return LLVMBuildNUWSub(g->builder, end_addr, align_adj, ""); } diff --git a/src/zig_llvm.cpp b/src/zig_llvm.cpp index c6f359f17d..8166173051 100644 --- a/src/zig_llvm.cpp +++ b/src/zig_llvm.cpp @@ -149,6 +149,10 @@ LLVMTargetMachineRef ZigLLVMCreateTargetMachine(LLVMTargetRef T, const char *Tri return reinterpret_cast(TM); } +unsigned ZigLLVMDataLayoutGetStackAlignment(LLVMTargetDataRef TD) { + return unwrap(TD)->getStackAlignment(); +} + bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMModuleRef module_ref, const char *filename, ZigLLVM_EmitOutputType output_type, char **error_message, bool is_debug, bool is_small, bool time_report) diff --git a/src/zig_llvm.h b/src/zig_llvm.h index 8f4d875cfe..8522a03c40 100644 --- a/src/zig_llvm.h +++ b/src/zig_llvm.h @@ -469,4 +469,6 @@ ZIG_EXTERN_C void ZigLLVMGetNativeTarget(enum ZigLLVM_ArchType *arch_type, enum enum ZigLLVM_VendorType *vendor_type, enum ZigLLVM_OSType *os_type, enum ZigLLVM_EnvironmentType *environ_type, enum ZigLLVM_ObjectFormatType *oformat); +ZIG_EXTERN_C unsigned ZigLLVMDataLayoutGetStackAlignment(LLVMTargetDataRef TD); + #endif