| ... | @@ -234,18 +234,23 @@ static void addLLVMArgAttrInt(LLVMValueRef fn_val, unsigned param_index, const c | ... | @@ -234,18 +234,23 @@ static void addLLVMArgAttrInt(LLVMValueRef fn_val, unsigned param_index, const c |
| 234 | return addLLVMAttrInt(fn_val, param_index + 1, attr_name, attr_val); | 234 | return addLLVMAttrInt(fn_val, param_index + 1, attr_name, attr_val); |
| 235 | } | 235 | } |
| 236 | | 236 | |
| 237 | static bool is_symbol_available(CodeGen *g, Buf *name) { | 237 | static bool is_symbol_available(CodeGen *g, const char *name) { |
| 238 | return g->exported_symbol_names.maybe_get(name) == nullptr && g->external_prototypes.maybe_get(name) == nullptr; | 238 | Buf *buf_name = buf_create_from_str(name); |
| | 239 | bool result = |
| | 240 | g->exported_symbol_names.maybe_get(buf_name) == nullptr && |
| | 241 | g->external_prototypes.maybe_get(buf_name) == nullptr; |
| | 242 | buf_destroy(buf_name); |
| | 243 | return result; |
| 239 | } | 244 | } |
| 240 | | 245 | |
| 241 | static Buf *get_mangled_name(CodeGen *g, Buf *original_name, bool external_linkage) { | 246 | static const char *get_mangled_name(CodeGen *g, const char *original_name, bool external_linkage) { |
| 242 | if (external_linkage || is_symbol_available(g, original_name)) { | 247 | if (external_linkage || is_symbol_available(g, original_name)) { |
| 243 | return original_name; | 248 | return original_name; |
| 244 | } | 249 | } |
| 245 | | 250 | |
| 246 | int n = 0; | 251 | int n = 0; |
| 247 | for (;; n += 1) { | 252 | for (;; n += 1) { |
| 248 | Buf *new_name = buf_sprintf("%s.%d", buf_ptr(original_name), n); | 253 | const char *new_name = buf_ptr(buf_sprintf("%s.%d", original_name, n)); |
| 249 | if (is_symbol_available(g, new_name)) { | 254 | if (is_symbol_available(g, new_name)) { |
| 250 | return new_name; | 255 | return new_name; |
| 251 | } | 256 | } |
| ... | @@ -387,8 +392,8 @@ static bool codegen_have_frame_pointer(CodeGen *g) { | ... | @@ -387,8 +392,8 @@ static bool codegen_have_frame_pointer(CodeGen *g) { |
| 387 | } | 392 | } |
| 388 | | 393 | |
| 389 | static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) { | 394 | static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) { |
| 390 | Buf *unmangled_name = &fn->symbol_name; | 395 | const char *unmangled_name = buf_ptr(&fn->symbol_name); |
| 391 | Buf *symbol_name; | 396 | const char *symbol_name; |
| 392 | GlobalLinkageId linkage; | 397 | GlobalLinkageId linkage; |
| 393 | if (fn->body_node == nullptr) { | 398 | if (fn->body_node == nullptr) { |
| 394 | symbol_name = unmangled_name; | 399 | symbol_name = unmangled_name; |
| ... | @@ -398,7 +403,7 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) { | ... | @@ -398,7 +403,7 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) { |
| 398 | linkage = GlobalLinkageIdInternal; | 403 | linkage = GlobalLinkageIdInternal; |
| 399 | } else { | 404 | } else { |
| 400 | GlobalExport *fn_export = &fn->export_list.items[0]; | 405 | GlobalExport *fn_export = &fn->export_list.items[0]; |
| 401 | symbol_name = &fn_export->name; | 406 | symbol_name = buf_ptr(&fn_export->name); |
| 402 | linkage = fn_export->linkage; | 407 | linkage = fn_export->linkage; |
| 403 | } | 408 | } |
| 404 | | 409 | |
| ... | @@ -408,7 +413,7 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) { | ... | @@ -408,7 +413,7 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) { |
| 408 | g->zig_target->arch == ZigLLVM_x86) | 413 | g->zig_target->arch == ZigLLVM_x86) |
| 409 | { | 414 | { |
| 410 | // prevent llvm name mangling | 415 | // prevent llvm name mangling |
| 411 | symbol_name = buf_sprintf("\x01_%s", buf_ptr(symbol_name)); | 416 | symbol_name = buf_ptr(buf_sprintf("\x01_%s", symbol_name)); |
| 412 | } | 417 | } |
| 413 | | 418 | |
| 414 | bool is_async = fn_is_async(fn); | 419 | bool is_async = fn_is_async(fn); |
| ... | @@ -420,13 +425,16 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) { | ... | @@ -420,13 +425,16 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) { |
| 420 | LLVMTypeRef fn_llvm_type = fn->raw_type_ref; | 425 | LLVMTypeRef fn_llvm_type = fn->raw_type_ref; |
| 421 | LLVMValueRef llvm_fn = nullptr; | 426 | LLVMValueRef llvm_fn = nullptr; |
| 422 | if (fn->body_node == nullptr) { | 427 | if (fn->body_node == nullptr) { |
| 423 | LLVMValueRef existing_llvm_fn = LLVMGetNamedFunction(g->module, buf_ptr(symbol_name)); | 428 | LLVMValueRef existing_llvm_fn = LLVMGetNamedFunction(g->module, symbol_name); |
| 424 | if (existing_llvm_fn) { | 429 | if (existing_llvm_fn) { |
| 425 | return LLVMConstBitCast(existing_llvm_fn, LLVMPointerType(fn_llvm_type, 0)); | 430 | return LLVMConstBitCast(existing_llvm_fn, LLVMPointerType(fn_llvm_type, 0)); |
| 426 | } else { | 431 | } else { |
| 427 | auto entry = g->exported_symbol_names.maybe_get(symbol_name); | 432 | Buf *buf_symbol_name = buf_create_from_str(symbol_name); |
| | 433 | auto entry = g->exported_symbol_names.maybe_get(buf_symbol_name); |
| | 434 | buf_destroy(buf_symbol_name); |
| | 435 | |
| 428 | if (entry == nullptr) { | 436 | if (entry == nullptr) { |
| 429 | llvm_fn = LLVMAddFunction(g->module, buf_ptr(symbol_name), fn_llvm_type); | 437 | llvm_fn = LLVMAddFunction(g->module, symbol_name, fn_llvm_type); |
| 430 | | 438 | |
| 431 | if (target_is_wasm(g->zig_target)) { | 439 | if (target_is_wasm(g->zig_target)) { |
| 432 | assert(fn->proto_node->type == NodeTypeFnProto); | 440 | assert(fn->proto_node->type == NodeTypeFnProto); |
| ... | @@ -440,7 +448,7 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) { | ... | @@ -440,7 +448,7 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) { |
| 440 | TldFn *tld_fn = reinterpret_cast<TldFn *>(entry->value); | 448 | TldFn *tld_fn = reinterpret_cast<TldFn *>(entry->value); |
| 441 | // Make the raw_type_ref populated | 449 | // Make the raw_type_ref populated |
| 442 | resolve_llvm_types_fn(g, tld_fn->fn_entry); | 450 | resolve_llvm_types_fn(g, tld_fn->fn_entry); |
| 443 | tld_fn->fn_entry->llvm_value = LLVMAddFunction(g->module, buf_ptr(symbol_name), | 451 | tld_fn->fn_entry->llvm_value = LLVMAddFunction(g->module, symbol_name, |
| 444 | tld_fn->fn_entry->raw_type_ref); | 452 | tld_fn->fn_entry->raw_type_ref); |
| 445 | llvm_fn = LLVMConstBitCast(tld_fn->fn_entry->llvm_value, LLVMPointerType(fn_llvm_type, 0)); | 453 | llvm_fn = LLVMConstBitCast(tld_fn->fn_entry->llvm_value, LLVMPointerType(fn_llvm_type, 0)); |
| 446 | return llvm_fn; | 454 | return llvm_fn; |
| ... | @@ -448,7 +456,7 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) { | ... | @@ -448,7 +456,7 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) { |
| 448 | } | 456 | } |
| 449 | } else { | 457 | } else { |
| 450 | if (llvm_fn == nullptr) { | 458 | if (llvm_fn == nullptr) { |
| 451 | llvm_fn = LLVMAddFunction(g->module, buf_ptr(symbol_name), fn_llvm_type); | 459 | llvm_fn = LLVMAddFunction(g->module, symbol_name, fn_llvm_type); |
| 452 | } | 460 | } |
| 453 | | 461 | |
| 454 | for (size_t i = 1; i < fn->export_list.length; i += 1) { | 462 | for (size_t i = 1; i < fn->export_list.length; i += 1) { |
| ... | @@ -1058,8 +1066,8 @@ static LLVMValueRef get_add_error_return_trace_addr_fn(CodeGen *g) { | ... | @@ -1058,8 +1066,8 @@ static LLVMValueRef get_add_error_return_trace_addr_fn(CodeGen *g) { |
| 1058 | }; | 1066 | }; |
| 1059 | LLVMTypeRef fn_type_ref = LLVMFunctionType(LLVMVoidType(), arg_types, 2, false); | 1067 | LLVMTypeRef fn_type_ref = LLVMFunctionType(LLVMVoidType(), arg_types, 2, false); |
| 1060 | | 1068 | |
| 1061 | Buf *fn_name = get_mangled_name(g, buf_create_from_str("__zig_add_err_ret_trace_addr"), false); | 1069 | const char *fn_name = get_mangled_name(g, "__zig_add_err_ret_trace_addr", false); |
| 1062 | LLVMValueRef fn_val = LLVMAddFunction(g->module, buf_ptr(fn_name), fn_type_ref); | 1070 | LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref); |
| 1063 | addLLVMFnAttr(fn_val, "alwaysinline"); | 1071 | addLLVMFnAttr(fn_val, "alwaysinline"); |
| 1064 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); | 1072 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); |
| 1065 | LLVMSetFunctionCallConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); | 1073 | LLVMSetFunctionCallConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); |
| ... | @@ -1138,8 +1146,8 @@ static LLVMValueRef get_return_err_fn(CodeGen *g) { | ... | @@ -1138,8 +1146,8 @@ static LLVMValueRef get_return_err_fn(CodeGen *g) { |
| 1138 | }; | 1146 | }; |
| 1139 | LLVMTypeRef fn_type_ref = LLVMFunctionType(LLVMVoidType(), arg_types, 1, false); | 1147 | LLVMTypeRef fn_type_ref = LLVMFunctionType(LLVMVoidType(), arg_types, 1, false); |
| 1140 | | 1148 | |
| 1141 | Buf *fn_name = get_mangled_name(g, buf_create_from_str("__zig_return_error"), false); | 1149 | const char *fn_name = get_mangled_name(g, "__zig_return_error", false); |
| 1142 | LLVMValueRef fn_val = LLVMAddFunction(g->module, buf_ptr(fn_name), fn_type_ref); | 1150 | LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref); |
| 1143 | addLLVMFnAttr(fn_val, "noinline"); // so that we can look at return address | 1151 | addLLVMFnAttr(fn_val, "noinline"); // so that we can look at return address |
| 1144 | addLLVMFnAttr(fn_val, "cold"); | 1152 | addLLVMFnAttr(fn_val, "cold"); |
| 1145 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); | 1153 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); |
| ... | @@ -1208,7 +1216,7 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) { | ... | @@ -1208,7 +1216,7 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) { |
| 1208 | LLVMSetLinkage(msg_prefix, LLVMInternalLinkage); | 1216 | LLVMSetLinkage(msg_prefix, LLVMInternalLinkage); |
| 1209 | LLVMSetGlobalConstant(msg_prefix, true); | 1217 | LLVMSetGlobalConstant(msg_prefix, true); |
| 1210 | | 1218 | |
| 1211 | Buf *fn_name = get_mangled_name(g, buf_create_from_str("__zig_fail_unwrap"), false); | 1219 | const char *fn_name = get_mangled_name(g, "__zig_fail_unwrap", false); |
| 1212 | LLVMTypeRef fn_type_ref; | 1220 | LLVMTypeRef fn_type_ref; |
| 1213 | if (g->have_err_ret_tracing) { | 1221 | if (g->have_err_ret_tracing) { |
| 1214 | LLVMTypeRef arg_types[] = { | 1222 | LLVMTypeRef arg_types[] = { |
| ... | @@ -1222,7 +1230,7 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) { | ... | @@ -1222,7 +1230,7 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) { |
| 1222 | }; | 1230 | }; |
| 1223 | fn_type_ref = LLVMFunctionType(LLVMVoidType(), arg_types, 1, false); | 1231 | fn_type_ref = LLVMFunctionType(LLVMVoidType(), arg_types, 1, false); |
| 1224 | } | 1232 | } |
| 1225 | LLVMValueRef fn_val = LLVMAddFunction(g->module, buf_ptr(fn_name), fn_type_ref); | 1233 | LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref); |
| 1226 | addLLVMFnAttr(fn_val, "noreturn"); | 1234 | addLLVMFnAttr(fn_val, "noreturn"); |
| 1227 | addLLVMFnAttr(fn_val, "cold"); | 1235 | addLLVMFnAttr(fn_val, "cold"); |
| 1228 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); | 1236 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); |
| ... | @@ -1805,7 +1813,7 @@ static bool iter_function_params_c_abi(CodeGen *g, ZigType *fn_type, FnWalk *fn_ | ... | @@ -1805,7 +1813,7 @@ static bool iter_function_params_c_abi(CodeGen *g, ZigType *fn_type, FnWalk *fn_ |
| 1805 | fn_walk->data.types.param_di_types->append(get_llvm_di_type(g, ty)); | 1813 | fn_walk->data.types.param_di_types->append(get_llvm_di_type(g, ty)); |
| 1806 | break; | 1814 | break; |
| 1807 | case FnWalkIdVars: { | 1815 | case FnWalkIdVars: { |
| 1808 | var->value_ref = build_alloca(g, ty, buf_ptr(&var->name), var->align_bytes); | 1816 | var->value_ref = build_alloca(g, ty, var->name, var->align_bytes); |
| 1809 | di_arg_index = fn_walk->data.vars.gen_i; | 1817 | di_arg_index = fn_walk->data.vars.gen_i; |
| 1810 | fn_walk->data.vars.gen_i += 1; | 1818 | fn_walk->data.vars.gen_i += 1; |
| 1811 | dest_ty = ty; | 1819 | dest_ty = ty; |
| ... | @@ -1916,7 +1924,7 @@ static bool iter_function_params_c_abi(CodeGen *g, ZigType *fn_type, FnWalk *fn_ | ... | @@ -1916,7 +1924,7 @@ static bool iter_function_params_c_abi(CodeGen *g, ZigType *fn_type, FnWalk *fn_ |
| 1916 | } | 1924 | } |
| 1917 | case FnWalkIdVars: { | 1925 | case FnWalkIdVars: { |
| 1918 | di_arg_index = fn_walk->data.vars.gen_i; | 1926 | di_arg_index = fn_walk->data.vars.gen_i; |
| 1919 | var->value_ref = build_alloca(g, ty, buf_ptr(&var->name), var->align_bytes); | 1927 | var->value_ref = build_alloca(g, ty, var->name, var->align_bytes); |
| 1920 | fn_walk->data.vars.gen_i += 1; | 1928 | fn_walk->data.vars.gen_i += 1; |
| 1921 | dest_ty = ty; | 1929 | dest_ty = ty; |
| 1922 | goto var_ok; | 1930 | goto var_ok; |
| ... | @@ -1949,7 +1957,7 @@ var_ok: | ... | @@ -1949,7 +1957,7 @@ var_ok: |
| 1949 | if (dest_ty != nullptr && var->decl_node) { | 1957 | if (dest_ty != nullptr && var->decl_node) { |
| 1950 | // arg index + 1 because the 0 index is return value | 1958 | // arg index + 1 because the 0 index is return value |
| 1951 | var->di_loc_var = ZigLLVMCreateParameterVariable(g->dbuilder, get_di_scope(g, var->parent_scope), | 1959 | var->di_loc_var = ZigLLVMCreateParameterVariable(g->dbuilder, get_di_scope(g, var->parent_scope), |
| 1952 | buf_ptr(&var->name), fn_walk->data.vars.import->data.structure.root_struct->di_file, | 1960 | var->name, fn_walk->data.vars.import->data.structure.root_struct->di_file, |
| 1953 | (unsigned)(var->decl_node->line + 1), | 1961 | (unsigned)(var->decl_node->line + 1), |
| 1954 | get_llvm_di_type(g, dest_ty), !g->strip_debug_symbols, 0, di_arg_index + 1); | 1962 | get_llvm_di_type(g, dest_ty), !g->strip_debug_symbols, 0, di_arg_index + 1); |
| 1955 | } | 1963 | } |
| ... | @@ -2060,8 +2068,8 @@ static LLVMValueRef get_merge_err_ret_traces_fn_val(CodeGen *g) { | ... | @@ -2060,8 +2068,8 @@ static LLVMValueRef get_merge_err_ret_traces_fn_val(CodeGen *g) { |
| 2060 | }; | 2068 | }; |
| 2061 | LLVMTypeRef fn_type_ref = LLVMFunctionType(LLVMVoidType(), param_types, 2, false); | 2069 | LLVMTypeRef fn_type_ref = LLVMFunctionType(LLVMVoidType(), param_types, 2, false); |
| 2062 | | 2070 | |
| 2063 | Buf *fn_name = get_mangled_name(g, buf_create_from_str("__zig_merge_error_return_traces"), false); | 2071 | const char *fn_name = get_mangled_name(g, "__zig_merge_error_return_traces", false); |
| 2064 | LLVMValueRef fn_val = LLVMAddFunction(g->module, buf_ptr(fn_name), fn_type_ref); | 2072 | LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref); |
| 2065 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); | 2073 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); |
| 2066 | LLVMSetFunctionCallConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); | 2074 | LLVMSetFunctionCallConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); |
| 2067 | addLLVMFnAttr(fn_val, "nounwind"); | 2075 | addLLVMFnAttr(fn_val, "nounwind"); |
| ... | @@ -3743,12 +3751,11 @@ static void render_async_spills(CodeGen *g) { | ... | @@ -3743,12 +3751,11 @@ static void render_async_spills(CodeGen *g) { |
| 3743 | continue; | 3751 | continue; |
| 3744 | } | 3752 | } |
| 3745 | | 3753 | |
| 3746 | var->value_ref = LLVMBuildStructGEP(g->builder, g->cur_frame_ptr, async_var_index, | 3754 | var->value_ref = LLVMBuildStructGEP(g->builder, g->cur_frame_ptr, async_var_index, var->name); |
| 3747 | buf_ptr(&var->name)); | | |
| 3748 | async_var_index += 1; | 3755 | async_var_index += 1; |
| 3749 | if (var->decl_node) { | 3756 | if (var->decl_node) { |
| 3750 | var->di_loc_var = ZigLLVMCreateAutoVariable(g->dbuilder, get_di_scope(g, var->parent_scope), | 3757 | var->di_loc_var = ZigLLVMCreateAutoVariable(g->dbuilder, get_di_scope(g, var->parent_scope), |
| 3751 | buf_ptr(&var->name), import->data.structure.root_struct->di_file, | 3758 | var->name, import->data.structure.root_struct->di_file, |
| 3752 | (unsigned)(var->decl_node->line + 1), | 3759 | (unsigned)(var->decl_node->line + 1), |
| 3753 | get_llvm_di_type(g, var->var_type), !g->strip_debug_symbols, 0); | 3760 | get_llvm_di_type(g, var->var_type), !g->strip_debug_symbols, 0); |
| 3754 | gen_var_debug_decl(g, var); | 3761 | gen_var_debug_decl(g, var); |
| ... | @@ -4653,8 +4660,9 @@ static LLVMValueRef get_enum_tag_name_function(CodeGen *g, ZigType *enum_type) { | ... | @@ -4653,8 +4660,9 @@ static LLVMValueRef get_enum_tag_name_function(CodeGen *g, ZigType *enum_type) { |
| 4653 | LLVMTypeRef fn_type_ref = LLVMFunctionType(LLVMPointerType(get_llvm_type(g, u8_slice_type), 0), | 4660 | LLVMTypeRef fn_type_ref = LLVMFunctionType(LLVMPointerType(get_llvm_type(g, u8_slice_type), 0), |
| 4654 | &tag_int_llvm_type, 1, false); | 4661 | &tag_int_llvm_type, 1, false); |
| 4655 | | 4662 | |
| 4656 | Buf *fn_name = get_mangled_name(g, buf_sprintf("__zig_tag_name_%s", buf_ptr(&enum_type->name)), false); | 4663 | const char *fn_name = get_mangled_name(g, |
| 4657 | LLVMValueRef fn_val = LLVMAddFunction(g->module, buf_ptr(fn_name), fn_type_ref); | 4664 | buf_ptr(buf_sprintf("__zig_tag_name_%s", buf_ptr(&enum_type->name))), false); |
| | 4665 | LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref); |
| 4658 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); | 4666 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); |
| 4659 | LLVMSetFunctionCallConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); | 4667 | LLVMSetFunctionCallConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); |
| 4660 | addLLVMFnAttr(fn_val, "nounwind"); | 4668 | addLLVMFnAttr(fn_val, "nounwind"); |
| ... | @@ -6919,7 +6927,7 @@ static void generate_error_name_table(CodeGen *g) { | ... | @@ -6919,7 +6927,7 @@ static void generate_error_name_table(CodeGen *g) { |
| 6919 | LLVMValueRef err_name_table_init = LLVMConstArray(get_llvm_type(g, str_type), values, (unsigned)g->errors_by_index.length); | 6927 | LLVMValueRef err_name_table_init = LLVMConstArray(get_llvm_type(g, str_type), values, (unsigned)g->errors_by_index.length); |
| 6920 | | 6928 | |
| 6921 | g->err_name_table = LLVMAddGlobal(g->module, LLVMTypeOf(err_name_table_init), | 6929 | g->err_name_table = LLVMAddGlobal(g->module, LLVMTypeOf(err_name_table_init), |
| 6922 | buf_ptr(get_mangled_name(g, buf_create_from_str("__zig_err_name_table"), false))); | 6930 | get_mangled_name(g, buf_ptr(buf_create_from_str("__zig_err_name_table")), false)); |
| 6923 | LLVMSetInitializer(g->err_name_table, err_name_table_init); | 6931 | LLVMSetInitializer(g->err_name_table, err_name_table_init); |
| 6924 | LLVMSetLinkage(g->err_name_table, LLVMPrivateLinkage); | 6932 | LLVMSetLinkage(g->err_name_table, LLVMPrivateLinkage); |
| 6925 | LLVMSetGlobalConstant(g->err_name_table, true); | 6933 | LLVMSetGlobalConstant(g->err_name_table, true); |
| ... | @@ -6960,8 +6968,8 @@ static void gen_global_var(CodeGen *g, ZigVar *var, LLVMValueRef init_val, | ... | @@ -6960,8 +6968,8 @@ static void gen_global_var(CodeGen *g, ZigVar *var, LLVMValueRef init_val, |
| 6960 | assert(import); | 6968 | assert(import); |
| 6961 | | 6969 | |
| 6962 | bool is_local_to_unit = true; | 6970 | bool is_local_to_unit = true; |
| 6963 | ZigLLVMCreateGlobalVariable(g->dbuilder, get_di_scope(g, var->parent_scope), buf_ptr(&var->name), | 6971 | ZigLLVMCreateGlobalVariable(g->dbuilder, get_di_scope(g, var->parent_scope), var->name, |
| 6964 | buf_ptr(&var->name), import->data.structure.root_struct->di_file, | 6972 | var->name, import->data.structure.root_struct->di_file, |
| 6965 | (unsigned)(var->decl_node->line + 1), | 6973 | (unsigned)(var->decl_node->line + 1), |
| 6966 | get_llvm_di_type(g, type_entry), is_local_to_unit); | 6974 | get_llvm_di_type(g, type_entry), is_local_to_unit); |
| 6967 | | 6975 | |
| ... | @@ -7043,8 +7051,8 @@ static void do_code_gen(CodeGen *g) { | ... | @@ -7043,8 +7051,8 @@ static void do_code_gen(CodeGen *g) { |
| 7043 | assert(var->decl_node); | 7051 | assert(var->decl_node); |
| 7044 | | 7052 | |
| 7045 | GlobalLinkageId linkage; | 7053 | GlobalLinkageId linkage; |
| 7046 | Buf *unmangled_name = &var->name; | 7054 | const char *unmangled_name = var->name; |
| 7047 | Buf *symbol_name; | 7055 | const char *symbol_name; |
| 7048 | if (var->export_list.length == 0) { | 7056 | if (var->export_list.length == 0) { |
| 7049 | if (var->decl_node->data.variable_declaration.is_extern) { | 7057 | if (var->decl_node->data.variable_declaration.is_extern) { |
| 7050 | symbol_name = unmangled_name; | 7058 | symbol_name = unmangled_name; |
| ... | @@ -7055,19 +7063,19 @@ static void do_code_gen(CodeGen *g) { | ... | @@ -7055,19 +7063,19 @@ static void do_code_gen(CodeGen *g) { |
| 7055 | } | 7063 | } |
| 7056 | } else { | 7064 | } else { |
| 7057 | GlobalExport *global_export = &var->export_list.items[0]; | 7065 | GlobalExport *global_export = &var->export_list.items[0]; |
| 7058 | symbol_name = &global_export->name; | 7066 | symbol_name = buf_ptr(&global_export->name); |
| 7059 | linkage = global_export->linkage; | 7067 | linkage = global_export->linkage; |
| 7060 | } | 7068 | } |
| 7061 | | 7069 | |
| 7062 | LLVMValueRef global_value; | 7070 | LLVMValueRef global_value; |
| 7063 | bool externally_initialized = var->decl_node->data.variable_declaration.expr == nullptr; | 7071 | bool externally_initialized = var->decl_node->data.variable_declaration.expr == nullptr; |
| 7064 | if (externally_initialized) { | 7072 | if (externally_initialized) { |
| 7065 | LLVMValueRef existing_llvm_var = LLVMGetNamedGlobal(g->module, buf_ptr(symbol_name)); | 7073 | LLVMValueRef existing_llvm_var = LLVMGetNamedGlobal(g->module, symbol_name); |
| 7066 | if (existing_llvm_var) { | 7074 | if (existing_llvm_var) { |
| 7067 | global_value = LLVMConstBitCast(existing_llvm_var, | 7075 | global_value = LLVMConstBitCast(existing_llvm_var, |
| 7068 | LLVMPointerType(get_llvm_type(g, var->var_type), 0)); | 7076 | LLVMPointerType(get_llvm_type(g, var->var_type), 0)); |
| 7069 | } else { | 7077 | } else { |
| 7070 | global_value = LLVMAddGlobal(g->module, get_llvm_type(g, var->var_type), buf_ptr(symbol_name)); | 7078 | global_value = LLVMAddGlobal(g->module, get_llvm_type(g, var->var_type), symbol_name); |
| 7071 | // TODO debug info for the extern variable | 7079 | // TODO debug info for the extern variable |
| 7072 | | 7080 | |
| 7073 | LLVMSetLinkage(global_value, to_llvm_linkage(linkage)); | 7081 | LLVMSetLinkage(global_value, to_llvm_linkage(linkage)); |
| ... | @@ -7078,8 +7086,8 @@ static void do_code_gen(CodeGen *g) { | ... | @@ -7078,8 +7086,8 @@ static void do_code_gen(CodeGen *g) { |
| 7078 | } | 7086 | } |
| 7079 | } else { | 7087 | } else { |
| 7080 | bool exported = (linkage != GlobalLinkageIdInternal); | 7088 | bool exported = (linkage != GlobalLinkageIdInternal); |
| 7081 | render_const_val(g, var->const_value, buf_ptr(symbol_name)); | 7089 | render_const_val(g, var->const_value, symbol_name); |
| 7082 | render_const_val_global(g, var->const_value, buf_ptr(symbol_name)); | 7090 | render_const_val_global(g, var->const_value, symbol_name); |
| 7083 | global_value = var->const_value->global_refs->llvm_global; | 7091 | global_value = var->const_value->global_refs->llvm_global; |
| 7084 | | 7092 | |
| 7085 | if (exported) { | 7093 | if (exported) { |
| ... | @@ -7234,7 +7242,7 @@ static void do_code_gen(CodeGen *g) { | ... | @@ -7234,7 +7242,7 @@ static void do_code_gen(CodeGen *g) { |
| 7234 | | 7242 | |
| 7235 | if (var->src_arg_index == SIZE_MAX) { | 7243 | if (var->src_arg_index == SIZE_MAX) { |
| 7236 | var->di_loc_var = ZigLLVMCreateAutoVariable(g->dbuilder, get_di_scope(g, var->parent_scope), | 7244 | var->di_loc_var = ZigLLVMCreateAutoVariable(g->dbuilder, get_di_scope(g, var->parent_scope), |
| 7237 | buf_ptr(&var->name), import->data.structure.root_struct->di_file, (unsigned)(var->decl_node->line + 1), | 7245 | var->name, import->data.structure.root_struct->di_file, (unsigned)(var->decl_node->line + 1), |
| 7238 | get_llvm_di_type(g, var->var_type), !g->strip_debug_symbols, 0); | 7246 | get_llvm_di_type(g, var->var_type), !g->strip_debug_symbols, 0); |
| 7239 | | 7247 | |
| 7240 | } else if (is_c_abi) { | 7248 | } else if (is_c_abi) { |
| ... | @@ -7254,11 +7262,11 @@ static void do_code_gen(CodeGen *g) { | ... | @@ -7254,11 +7262,11 @@ static void do_code_gen(CodeGen *g) { |
| 7254 | var->value_ref = LLVMGetParam(fn, gen_info->gen_index); | 7262 | var->value_ref = LLVMGetParam(fn, gen_info->gen_index); |
| 7255 | } else { | 7263 | } else { |
| 7256 | gen_type = var->var_type; | 7264 | gen_type = var->var_type; |
| 7257 | var->value_ref = build_alloca(g, var->var_type, buf_ptr(&var->name), var->align_bytes); | 7265 | var->value_ref = build_alloca(g, var->var_type, var->name, var->align_bytes); |
| 7258 | } | 7266 | } |
| 7259 | if (var->decl_node) { | 7267 | if (var->decl_node) { |
| 7260 | var->di_loc_var = ZigLLVMCreateParameterVariable(g->dbuilder, get_di_scope(g, var->parent_scope), | 7268 | var->di_loc_var = ZigLLVMCreateParameterVariable(g->dbuilder, get_di_scope(g, var->parent_scope), |
| 7261 | buf_ptr(&var->name), import->data.structure.root_struct->di_file, | 7269 | var->name, import->data.structure.root_struct->di_file, |
| 7262 | (unsigned)(var->decl_node->line + 1), | 7270 | (unsigned)(var->decl_node->line + 1), |
| 7263 | get_llvm_di_type(g, gen_type), !g->strip_debug_symbols, 0, (unsigned)(gen_info->gen_index+1)); | 7271 | get_llvm_di_type(g, gen_type), !g->strip_debug_symbols, 0, (unsigned)(gen_info->gen_index+1)); |
| 7264 | } | 7272 | } |