| ... | @@ -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 | } |
| 292 | | 292 | |
| | 293 | static 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 | |
| 293 | static void addLLVMFnAttr(LLVMValueRef fn_val, const char *attr_name) { | 302 | static 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 | } |
| 300 | | 309 | |
| | 310 | static 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 | |
| 301 | static void addLLVMArgAttr(LLVMValueRef arg_val, unsigned param_index, const char *attr_name) { | 314 | static 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 | } |
| 441 | | 454 | |
| | 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) { |