aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2017-10-02 09:55:18 -0400
committerAndrew Kelley <superjoe30@gmail.com>2017-10-02 09:55:49 -0400
commitec40542c44b1d1fa29f24033b2ba1c471026721a (patch)
tree94a25d63e987a014ef7e9548a8642d12a2670cb3 /src/codegen.cpp
parent0a4283b38ba40242f8f9302a63e8c4d664a50799 (diff)
downloadzig-ec40542c44b1d1fa29f24033b2ba1c471026721a.tar.gz
zig-ec40542c44b1d1fa29f24033b2ba1c471026721a.zip
windows: alignstack=16 on every function
See #302
Diffstat (limited to 'src/codegen.cpp')
-rw-r--r--src/codegen.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp
index f0826e3c49..18d19e39f0 100644
--- a/src/codegen.cpp
+++ b/src/codegen.cpp
@@ -290,6 +290,15 @@ static void addLLVMAttrStr(LLVMValueRef val, LLVMAttributeIndex attr_index,
LLVMAddAttributeAtIndex(val, attr_index, llvm_attr);
}
+static void addLLVMAttrInt(LLVMValueRef val, LLVMAttributeIndex attr_index,
+ const char *attr_name, uint64_t attr_val)
+{
+ unsigned kind_id = LLVMGetEnumAttributeKindForName(attr_name, strlen(attr_name));
+ assert(kind_id != 0);
+ LLVMAttributeRef llvm_attr = LLVMCreateEnumAttribute(LLVMGetGlobalContext(), kind_id, attr_val);
+ LLVMAddAttributeAtIndex(val, attr_index, llvm_attr);
+}
+
static void addLLVMFnAttr(LLVMValueRef fn_val, const char *attr_name) {
return addLLVMAttr(fn_val, -1, attr_name);
}
@@ -298,6 +307,10 @@ static void addLLVMFnAttrStr(LLVMValueRef fn_val, const char *attr_name, const c
return addLLVMAttrStr(fn_val, -1, attr_name, attr_val);
}
+static void addLLVMFnAttrInt(LLVMValueRef fn_val, const char *attr_name, uint64_t attr_val) {
+ return addLLVMAttrInt(fn_val, -1, attr_name, attr_val);
+}
+
static void addLLVMArgAttr(LLVMValueRef arg_val, unsigned param_index, const char *attr_name) {
return addLLVMAttr(arg_val, param_index + 1, attr_name);
}
@@ -439,6 +452,12 @@ static LLVMValueRef fn_llvm_value(CodeGen *g, FnTableEntry *fn_table_entry) {
}
}
+ if (g->zig_target.os == ZigLLVM_Win32 && g->zig_target.arch.arch == ZigLLVM_x86_64 &&
+ fn_type->data.fn.fn_type_id.cc != CallingConventionNaked)
+ {
+ addLLVMFnAttrInt(fn_table_entry->llvm_value, "alignstack", 16);
+ }
+
addLLVMFnAttr(fn_table_entry->llvm_value, "nounwind");
addLLVMFnAttr(fn_table_entry->llvm_value, "nobuiltin");
if (g->build_mode == BuildModeDebug && fn_table_entry->fn_inline != FnInlineAlways) {