diff --git a/src/compiler/compiler_internal.h b/src/compiler/compiler_internal.h index 59666bde8..3fcb8116e 100644 --- a/src/compiler/compiler_internal.h +++ b/src/compiler/compiler_internal.h @@ -1955,6 +1955,7 @@ extern const char *kw_inout; extern const char *kw_len; extern const char *kw_main; extern const char *kw_mainstub; +extern const char *kw_memcmp; extern const char *kw_nameof; extern const char *kw_offsetof; extern const char *kw_ordinal; diff --git a/src/compiler/llvm_codegen.c b/src/compiler/llvm_codegen.c index e28ae88d0..e4a26391d 100644 --- a/src/compiler/llvm_codegen.c +++ b/src/compiler/llvm_codegen.c @@ -1213,7 +1213,14 @@ LLVMValueRef llvm_get_ref(GenContext *c, Decl *decl) } LLVMTypeRef type = llvm_get_type(c, decl->type); scratch_buffer_set_extern_decl_name(decl, true); - backend_ref = decl->backend_ref = LLVMAddFunction(c->module, scratch_buffer_to_string(), type); + if (decl->name == kw_memcmp && c->memcmp_function) + { + backend_ref = decl->backend_ref = c->memcmp_function; + } + else + { + backend_ref = decl->backend_ref = LLVMAddFunction(c->module, scratch_buffer_to_string(), type); + } llvm_append_function_attributes(c, decl); if (decl->is_export && platform_target.os == OS_TYPE_WIN32 && !active_target.win.def && decl->name != kw_main && decl->name != kw_mainstub) { diff --git a/src/compiler/llvm_codegen_expr.c b/src/compiler/llvm_codegen_expr.c index 733258af7..4b0dc1ff8 100644 --- a/src/compiler/llvm_codegen_expr.c +++ b/src/compiler/llvm_codegen_expr.c @@ -3691,10 +3691,10 @@ static inline void llvm_emit_memcmp(GenContext *c, BEValue *be_value, LLVMValueR { if (!c->memcmp_function) { - c->memcmp_function = LLVMGetNamedFunction(c->module, "memcmp"); + c->memcmp_function = LLVMGetNamedFunction(c->module, kw_memcmp); if (!c->memcmp_function) { - c->memcmp_function = LLVMAddFunction(c->module, "memcmp", c->memcmp_function_type); + c->memcmp_function = LLVMAddFunction(c->module, kw_memcmp, c->memcmp_function_type); } } LLVMValueRef args[3] = { ptr, other_ptr, size }; diff --git a/src/compiler/symtab.c b/src/compiler/symtab.c index 14ea92f4d..ab928dffb 100644 --- a/src/compiler/symtab.c +++ b/src/compiler/symtab.c @@ -51,6 +51,7 @@ const char *kw_in; const char *kw_inout; const char *kw_len; const char *kw_main; +const char *kw_memcmp; const char *kw_mainstub; const char *kw_nameof; const char *kw_offsetof; @@ -135,6 +136,7 @@ void symtab_init(uint32_t capacity) kw_inout = KW_DEF("inout"); kw_mainstub = KW_DEF("_$main"); kw_main = KW_DEF("main"); + kw_memcmp = KW_DEF("memcmp"); kw_nameof = KW_DEF("nameof"); kw_offsetof = KW_DEF("offsetof"); kw_ordinal = KW_DEF("ordinal");