aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2017-09-24 05:04:44 -0400
committerAndrew Kelley <superjoe30@gmail.com>2017-09-24 05:04:44 -0400
commit6c3a56a7ffd5a2ec5119447aa81dce9bf6ec1319 (patch)
tree530baf8f30658aaeb13b1bc14ba699101308e271 /src/codegen.cpp
parent8f0dfcbcfb8e4525006de4aa8f3f7a596e7208d5 (diff)
downloadzig-6c3a56a7ffd5a2ec5119447aa81dce9bf6ec1319.tar.gz
zig-6c3a56a7ffd5a2ec5119447aa81dce9bf6ec1319.zip
fix i386 windows stdcall
Diffstat (limited to 'src/codegen.cpp')
-rw-r--r--src/codegen.cpp19
1 files changed, 8 insertions, 11 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp
index 842b0205eb..5498647758 100644
--- a/src/codegen.cpp
+++ b/src/codegen.cpp
@@ -362,6 +362,14 @@ static LLVMValueRef fn_llvm_value(CodeGen *g, FnTableEntry *fn_table_entry) {
bool external_linkage = (fn_table_entry->linkage != GlobalLinkageIdInternal);
Buf *symbol_name = get_mangled_name(g, &fn_table_entry->symbol_name, external_linkage);
+ if (fn_table_entry->type_entry->data.fn.fn_type_id.cc == CallingConventionStdcall && external_linkage &&
+ g->zig_target.arch.arch == ZigLLVM_x86)
+ {
+ // prevent name mangling
+ symbol_name = buf_sprintf("\x01_%s", buf_ptr(symbol_name));
+ }
+
+
TypeTableEntry *fn_type = fn_table_entry->type_entry;
LLVMTypeRef fn_llvm_type = fn_type->data.fn.raw_type_ref;
if (external_linkage && fn_table_entry->body_node == nullptr) {
@@ -376,17 +384,6 @@ static LLVMValueRef fn_llvm_value(CodeGen *g, FnTableEntry *fn_table_entry) {
}
fn_table_entry->llvm_name = LLVMGetValueName(fn_table_entry->llvm_value);
- // TODO this is for testing windows DLL stuff
- //if (buf_eql_str(&fn_table_entry->symbol_name, "ExitProcess") ||
- // buf_eql_str(&fn_table_entry->symbol_name, "GetConsoleMode") ||
- // buf_eql_str(&fn_table_entry->symbol_name, "GetStdHandle") ||
- // buf_eql_str(&fn_table_entry->symbol_name, "GetFileInformationByHandleEx") ||
- // buf_eql_str(&fn_table_entry->symbol_name, "GetLastError") ||
- // buf_eql_str(&fn_table_entry->symbol_name, "WriteFile"))
- //{
- // LLVMSetDLLStorageClass(fn_table_entry->llvm_value, LLVMDLLImportStorageClass);
- //}
-
switch (fn_table_entry->fn_inline) {
case FnInlineAlways:
addLLVMFnAttr(fn_table_entry->llvm_value, "alwaysinline");