authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-10-02 09:55:18-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-10-02 09:55:49-04:00
logec40542c44b1d1fa29f24033b2ba1c471026721a
tree94a25d63e987a014ef7e9548a8642d12a2670cb3
parent0a4283b38ba40242f8f9302a63e8c4d664a50799

windows: alignstack=16 on every function

See #302

3 files changed, 29 insertions(+), 6 deletions(-)

ci/travis_linux_script+9
...@@ -21,3 +21,12 @@ wine test.exe...@@ -21,3 +21,12 @@ wine test.exe
2121
22./zig test ../test/behavior.zig --target-os windows --target-arch i386 --target-environ msvc --release-safe22./zig test ../test/behavior.zig --target-os windows --target-arch i386 --target-environ msvc --release-safe
23wine test.exe23wine test.exe
24
25./zig test ../test/behavior.zig --target-os windows --target-arch x86_64 --target-environ msvc
26wine64 test.exe
27
28./zig test ../test/behavior.zig --target-os windows --target-arch x86_64 --target-environ msvc --release-fast
29wine64 test.exe
30
31./zig test ../test/behavior.zig --target-os windows --target-arch x86_64 --target-environ msvc --release-safe
32wine64 test.exe
src/codegen.cpp+19
...@@ -290,6 +290,15 @@ static void addLLVMAttrStr(LLVMValueRef val, LLVMAttributeIndex attr_index,...@@ -290,6 +290,15 @@ static void addLLVMAttrStr(LLVMValueRef val, LLVMAttributeIndex attr_index,
290 LLVMAddAttributeAtIndex(val, attr_index, llvm_attr);290 LLVMAddAttributeAtIndex(val, attr_index, llvm_attr);
291}291}
292292
293static void addLLVMAttrInt(LLVMValueRef val, LLVMAttributeIndex attr_index,
294 const char *attr_name, uint64_t attr_val)
295{
296 unsigned kind_id = LLVMGetEnumAttributeKindForName(attr_name, strlen(attr_name));
297 assert(kind_id != 0);
298 LLVMAttributeRef llvm_attr = LLVMCreateEnumAttribute(LLVMGetGlobalContext(), kind_id, attr_val);
299 LLVMAddAttributeAtIndex(val, attr_index, llvm_attr);
300}
301
293static void addLLVMFnAttr(LLVMValueRef fn_val, const char *attr_name) {302static void addLLVMFnAttr(LLVMValueRef fn_val, const char *attr_name) {
294 return addLLVMAttr(fn_val, -1, attr_name);303 return addLLVMAttr(fn_val, -1, attr_name);
295}304}
...@@ -298,6 +307,10 @@ static void addLLVMFnAttrStr(LLVMValueRef fn_val, const char *attr_name, const c...@@ -298,6 +307,10 @@ static void addLLVMFnAttrStr(LLVMValueRef fn_val, const char *attr_name, const c
298 return addLLVMAttrStr(fn_val, -1, attr_name, attr_val);307 return addLLVMAttrStr(fn_val, -1, attr_name, attr_val);
299}308}
300309
310static void addLLVMFnAttrInt(LLVMValueRef fn_val, const char *attr_name, uint64_t attr_val) {
311 return addLLVMAttrInt(fn_val, -1, attr_name, attr_val);
312}
313
301static void addLLVMArgAttr(LLVMValueRef arg_val, unsigned param_index, const char *attr_name) {314static void addLLVMArgAttr(LLVMValueRef arg_val, unsigned param_index, const char *attr_name) {
302 return addLLVMAttr(arg_val, param_index + 1, attr_name);315 return addLLVMAttr(arg_val, param_index + 1, attr_name);
303}316}
...@@ -439,6 +452,12 @@ static LLVMValueRef fn_llvm_value(CodeGen *g, FnTableEntry *fn_table_entry) {...@@ -439,6 +452,12 @@ static LLVMValueRef fn_llvm_value(CodeGen *g, FnTableEntry *fn_table_entry) {
439 }452 }
440 }453 }
441454
455 if (g->zig_target.os == ZigLLVM_Win32 && g->zig_target.arch.arch == ZigLLVM_x86_64 &&
456 fn_type->data.fn.fn_type_id.cc != CallingConventionNaked)
457 {
458 addLLVMFnAttrInt(fn_table_entry->llvm_value, "alignstack", 16);
459 }
460
442 addLLVMFnAttr(fn_table_entry->llvm_value, "nounwind");461 addLLVMFnAttr(fn_table_entry->llvm_value, "nounwind");
443 addLLVMFnAttr(fn_table_entry->llvm_value, "nobuiltin");462 addLLVMFnAttr(fn_table_entry->llvm_value, "nobuiltin");
444 if (g->build_mode == BuildModeDebug && fn_table_entry->fn_inline != FnInlineAlways) {463 if (g->build_mode == BuildModeDebug && fn_table_entry->fn_inline != FnInlineAlways) {
test/cases/struct.zig+1-6
...@@ -258,12 +258,7 @@ test "packed struct 24bits" {...@@ -258,12 +258,7 @@ test "packed struct 24bits" {
258 assert(@sizeOf(Foo96Bits) == 12);258 assert(@sizeOf(Foo96Bits) == 12);
259 }259 }
260260
261 // TODO workaround for LLVM bug on windows261 var value = Foo96Bits {
262 // http://lists.llvm.org/pipermail/llvm-dev/2017-September/117864.html
263 const align_bytes = if (builtin.os == builtin.Os.windows and
264 builtin.arch == builtin.Arch.x86_64) 32 else @alignOf(Foo96Bits);
265
266 var value align(align_bytes) = Foo96Bits {
267 .a = 0,262 .a = 0,
268 .b = 0,263 .b = 0,
269 .c = 0,264 .c = 0,