authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-05-10 15:44:40-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-05-10 15:44:40-07:00
logc4c5020f0267758c7eb127689177cf1a70fb6d97
treee2acc6873952863d72d1a1e55104a3518fdefc89
parent9654a54d4a2729200d38dbb6eec827cb03dc0f90

fixups to the previous commit

* Rename std.builtin.GlobalVisibility to std.builtin.SymbolVisibility * Add missing compile error. From the LLVM language reference: "A symbol with internal or private linkage must have default visibility."

7 files changed, 44 insertions(+), 34 deletions(-)

lib/std/builtin.zig+2-2
......@@ -70,7 +70,7 @@ pub const GlobalLinkage = enum {
7070
7171/// This data structure is used by the Zig language code generation and
7272/// therefore must be kept in sync with the compiler implementation.
73pub const GlobalVisibility = enum {
73pub const SymbolVisibility = enum {
7474 default,
7575 hidden,
7676 protected,
......@@ -663,7 +663,7 @@ pub const ExportOptions = struct {
663663 name: []const u8,
664664 linkage: GlobalLinkage = .Strong,
665665 section: ?[]const u8 = null,
666 visibility: GlobalVisibility = .default,
666 visibility: SymbolVisibility = .default,
667667};
668668
669669/// This data structure is used by the Zig language code generation and
src/Sema.zig+20-10
......@@ -14999,27 +14999,37 @@ fn resolveExportOptions(
1499914999 const air_ref = sema.resolveInst(zir_ref);
1500015000 const options = try sema.coerce(block, export_options_ty, air_ref, src);
1500115001
15002 const name = try sema.fieldVal(block, src, options, "name", src);
15003 const name_val = try sema.resolveConstValue(block, src, name);
15002 const name_operand = try sema.fieldVal(block, src, options, "name", src);
15003 const name_val = try sema.resolveConstValue(block, src, name_operand);
15004 const name_ty = Type.initTag(.const_slice_u8);
15005 const name = try name_val.toAllocatedBytes(name_ty, sema.arena, sema.mod);
1500415006
15005 const linkage = try sema.fieldVal(block, src, options, "linkage", src);
15006 const linkage_val = try sema.resolveConstValue(block, src, linkage);
15007 const linkage_operand = try sema.fieldVal(block, src, options, "linkage", src);
15008 const linkage_val = try sema.resolveConstValue(block, src, linkage_operand);
15009 const linkage = linkage_val.toEnum(std.builtin.GlobalLinkage);
1500715010
1500815011 const section = try sema.fieldVal(block, src, options, "section", src);
1500915012 const section_val = try sema.resolveConstValue(block, src, section);
1501015013
15011 const visibility = try sema.fieldVal(block, src, options, "visibility", src);
15012 const visibility_val = try sema.resolveConstValue(block, src, visibility);
15014 const visibility_operand = try sema.fieldVal(block, src, options, "visibility", src);
15015 const visibility_val = try sema.resolveConstValue(block, src, visibility_operand);
15016 const visibility = visibility_val.toEnum(std.builtin.SymbolVisibility);
15017
15018 if (visibility != .default and linkage == .Internal) {
15019 return sema.fail(block, src, "symbol '{s}' exported with internal linkage has non-default visibility {s}", .{
15020 name, @tagName(visibility),
15021 });
15022 }
1501315023
1501415024 if (!section_val.isNull()) {
1501515025 return sema.fail(block, src, "TODO: implement exporting with linksection", .{});
1501615026 }
15017 const name_ty = Type.initTag(.const_slice_u8);
15027
1501815028 return std.builtin.ExportOptions{
15019 .name = try name_val.toAllocatedBytes(name_ty, sema.arena, sema.mod),
15020 .linkage = linkage_val.toEnum(std.builtin.GlobalLinkage),
15029 .name = name,
15030 .linkage = linkage,
1502115031 .section = null, // TODO
15022 .visibility = visibility_val.toEnum(std.builtin.GlobalVisibility),
15032 .visibility = visibility,
1502315033 };
1502415034}
1502515035
src/stage1/all_types.hpp+5-5
......@@ -571,10 +571,10 @@ enum GlobalLinkageId {
571571 GlobalLinkageIdLinkOnce,
572572};
573573
574enum GlobalVisibilityId {
575 GlobalVisibilityIdDefault,
576 GlobalVisibilityIdHidden,
577 GlobalVisibilityIdProtected,
574enum SymbolVisibilityId {
575 SymbolVisibilityIdDefault,
576 SymbolVisibilityIdHidden,
577 SymbolVisibilityIdProtected,
578578};
579579
580580enum TldId {
......@@ -1660,7 +1660,7 @@ enum FnAnalState {
16601660struct GlobalExport {
16611661 Buf name;
16621662 GlobalLinkageId linkage;
1663 GlobalVisibilityId visibility;
1663 SymbolVisibilityId visibility;
16641664};
16651665
16661666struct ZigFn {
src/stage1/analyze.cpp+5-5
......@@ -3717,7 +3717,7 @@ ZigType *get_test_fn_type(CodeGen *g) {
37173717 return g->test_fn_type;
37183718}
37193719
3720void add_var_export(CodeGen *g, ZigVar *var, const char *symbol_name, GlobalLinkageId linkage, GlobalVisibilityId visibility) {
3720void add_var_export(CodeGen *g, ZigVar *var, const char *symbol_name, GlobalLinkageId linkage, SymbolVisibilityId visibility) {
37213721 GlobalExport *global_export = var->export_list.add_one();
37223722 memset(global_export, 0, sizeof(GlobalExport));
37233723 buf_init_from_str(&global_export->name, symbol_name);
......@@ -3725,7 +3725,7 @@ void add_var_export(CodeGen *g, ZigVar *var, const char *symbol_name, GlobalLink
37253725 global_export->visibility = visibility;
37263726}
37273727
3728void add_fn_export(CodeGen *g, ZigFn *fn_table_entry, const char *symbol_name, GlobalLinkageId linkage, GlobalVisibilityId visibility, CallingConvention cc) {
3728void add_fn_export(CodeGen *g, ZigFn *fn_table_entry, const char *symbol_name, GlobalLinkageId linkage, SymbolVisibilityId visibility, CallingConvention cc) {
37293729 CallingConvention winapi_cc = g->zig_target->arch == ZigLLVM_x86
37303730 ? CallingConventionStdcall
37313731 : CallingConventionC;
......@@ -3854,13 +3854,13 @@ static void resolve_decl_fn(CodeGen *g, TldFn *tld_fn) {
38543854 case CallingConventionWin64:
38553855 case CallingConventionPtxKernel:
38563856 add_fn_export(g, fn_table_entry, buf_ptr(&fn_table_entry->symbol_name),
3857 GlobalLinkageIdStrong, GlobalVisibilityIdDefault, fn_cc);
3857 GlobalLinkageIdStrong, SymbolVisibilityIdDefault, fn_cc);
38583858 break;
38593859 case CallingConventionUnspecified:
38603860 // An exported function without a specific calling
38613861 // convention defaults to C
38623862 add_fn_export(g, fn_table_entry, buf_ptr(&fn_table_entry->symbol_name),
3863 GlobalLinkageIdStrong, GlobalVisibilityIdDefault, CallingConventionC);
3863 GlobalLinkageIdStrong, SymbolVisibilityIdDefault, CallingConventionC);
38643864 break;
38653865 }
38663866 }
......@@ -4323,7 +4323,7 @@ static void resolve_decl_var(CodeGen *g, TldVar *tld_var, bool allow_lazy) {
43234323
43244324 if (is_export) {
43254325 validate_export_var_type(g, type, source_node);
4326 add_var_export(g, tld_var->var, tld_var->var->name, GlobalLinkageIdStrong, GlobalVisibilityIdDefault);
4326 add_var_export(g, tld_var->var, tld_var->var->name, GlobalLinkageIdStrong, SymbolVisibilityIdDefault);
43274327 }
43284328
43294329 if (is_extern) {
src/stage1/analyze.hpp+2-2
......@@ -221,8 +221,8 @@ ZigType *get_align_amt_type(CodeGen *g);
221221ZigPackage *new_anonymous_package(void);
222222
223223Buf *const_value_to_buffer(ZigValue *const_val);
224void add_fn_export(CodeGen *g, ZigFn *fn_table_entry, const char *symbol_name, GlobalLinkageId linkage, GlobalVisibilityId visibility, CallingConvention cc);
225void add_var_export(CodeGen *g, ZigVar *fn_table_entry, const char *symbol_name, GlobalLinkageId linkage, GlobalVisibilityId visibility);
224void add_fn_export(CodeGen *g, ZigFn *fn_table_entry, const char *symbol_name, GlobalLinkageId linkage, SymbolVisibilityId visibility, CallingConvention cc);
225void add_var_export(CodeGen *g, ZigVar *fn_table_entry, const char *symbol_name, GlobalLinkageId linkage, SymbolVisibilityId visibility);
226226
227227
228228ZigValue *get_builtin_value(CodeGen *codegen, const char *name);
src/stage1/codegen.cpp+6-6
......@@ -242,13 +242,13 @@ static LLVMLinkage to_llvm_linkage(GlobalLinkageId id, bool is_extern) {
242242 zig_unreachable();
243243}
244244
245static LLVMVisibility to_llvm_visibility(GlobalVisibilityId id) {
245static LLVMVisibility to_llvm_visibility(SymbolVisibilityId id) {
246246 switch (id) {
247 case GlobalVisibilityIdDefault:
247 case SymbolVisibilityIdDefault:
248248 return LLVMDefaultVisibility;
249 case GlobalVisibilityIdHidden:
249 case SymbolVisibilityIdHidden:
250250 return LLVMHiddenVisibility;
251 case GlobalVisibilityIdProtected:
251 case SymbolVisibilityIdProtected:
252252 return LLVMProtectedVisibility;
253253 }
254254 zig_unreachable();
......@@ -412,7 +412,7 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) {
412412 const char *unmangled_name = buf_ptr(&fn->symbol_name);
413413 const char *symbol_name;
414414 GlobalLinkageId linkage;
415 GlobalVisibilityId visibility = GlobalVisibilityIdDefault;
415 SymbolVisibilityId visibility = SymbolVisibilityIdDefault;
416416 if (fn->body_node == nullptr) {
417417 symbol_name = unmangled_name;
418418 linkage = GlobalLinkageIdStrong;
......@@ -8967,7 +8967,7 @@ static void do_code_gen(CodeGen *g) {
89678967 assert(var->decl_node);
89688968
89698969 GlobalLinkageId linkage;
8970 GlobalVisibilityId visibility = GlobalVisibilityIdDefault;
8970 SymbolVisibilityId visibility = SymbolVisibilityIdDefault;
89718971 const char *unmangled_name = var->name;
89728972 const char *symbol_name;
89738973 if (var->export_list.length == 0) {
src/stage1/ir.cpp+4-4
......@@ -8635,11 +8635,11 @@ static bool ir_resolve_global_linkage(IrAnalyze *ira, Stage1AirInst *value, Glob
86358635 return true;
86368636}
86378637
8638static bool ir_resolve_global_visibility(IrAnalyze *ira, Stage1AirInst *value, GlobalVisibilityId *out) {
8638static bool ir_resolve_global_visibility(IrAnalyze *ira, Stage1AirInst *value, SymbolVisibilityId *out) {
86398639 if (type_is_invalid(value->value->type))
86408640 return false;
86418641
8642 ZigType *global_visibility_type = get_builtin_type(ira->codegen, "GlobalVisibility");
8642 ZigType *global_visibility_type = get_builtin_type(ira->codegen, "SymbolVisibility");
86438643
86448644 Stage1AirInst *casted_value = ir_implicit_cast(ira, value, global_visibility_type);
86458645 if (type_is_invalid(casted_value->value->type))
......@@ -8649,7 +8649,7 @@ static bool ir_resolve_global_visibility(IrAnalyze *ira, Stage1AirInst *value, G
86498649 if (!const_val)
86508650 return false;
86518651
8652 *out = (GlobalVisibilityId)bigint_as_u32(&const_val->data.x_enum_tag);
8652 *out = (SymbolVisibilityId)bigint_as_u32(&const_val->data.x_enum_tag);
86538653 return true;
86548654}
86558655
......@@ -11714,7 +11714,7 @@ static Stage1AirInst *ir_analyze_instruction_export(IrAnalyze *ira, Stage1ZirIns
1171411714 if (!ir_resolve_global_linkage(ira, linkage_inst, &global_linkage_id))
1171511715 return ira->codegen->invalid_inst_gen;
1171611716
11717 GlobalVisibilityId global_visibility_id;
11717 SymbolVisibilityId global_visibility_id;
1171811718 if (!ir_resolve_global_visibility(ira, visibility_inst, &global_visibility_id))
1171911719 return ira->codegen->invalid_inst_gen;
1172011720