authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-02-04 10:22:07-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2017-02-04 10:22:07-05:00
log0919ea0afd11a5f88146f84e8120cdd03b128b81
treeae7ea0e9768b148e369c825b6a2302b673d997aa
parent67b02326f88805df8bbda5e93d1cf46e40c48862

ability to set global variable alignment and ...

..section in the initialization expression

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

src/all_types.hpp+7-7
......@@ -222,6 +222,10 @@ struct TldVar {
222222 Tld base;
223223
224224 VariableTableEntry *var;
225 AstNode *set_global_align_node;
226 uint64_t alignment;
227 AstNode *set_global_section_node;
228 Buf *section_name;
225229};
226230
227231struct TldFn {
......@@ -1235,7 +1239,7 @@ struct CodeGen {
12351239 // The function prototypes this module includes. In the case of external declarations,
12361240 // there will not be a corresponding fn_defs entry.
12371241 ZigList<FnTableEntry *> fn_protos;
1238 ZigList<VariableTableEntry *> global_vars;
1242 ZigList<TldVar *> global_vars;
12391243
12401244 OutType out_type;
12411245 FnTableEntry *cur_fn;
......@@ -1307,10 +1311,6 @@ struct VariableTableEntry {
13071311 size_t mem_slot_index;
13081312 size_t ref_count;
13091313 VarLinkage linkage;
1310 AstNode *set_global_align_node;
1311 uint64_t alignment;
1312 AstNode *set_global_section_node;
1313 Buf *section_name;
13141314};
13151315
13161316struct ErrorTableEntry {
......@@ -2256,14 +2256,14 @@ struct IrInstructionCanImplicitCast {
22562256struct IrInstructionSetGlobalAlign {
22572257 IrInstruction base;
22582258
2259 VariableTableEntry *var;
2259 TldVar *tld_var;
22602260 IrInstruction *value;
22612261};
22622262
22632263struct IrInstructionSetGlobalSection {
22642264 IrInstruction base;
22652265
2266 VariableTableEntry *var;
2266 TldVar *tld_var;
22672267 IrInstruction *value;
22682268};
22692269
src/analyze.cpp+1-1
......@@ -1967,7 +1967,7 @@ static void resolve_decl_var(CodeGen *g, TldVar *tld_var) {
19671967 tld_var->var = add_variable(g, source_node, tld_var->base.parent_scope, var_decl->symbol, is_const, init_val);
19681968 tld_var->var->linkage = linkage;
19691969
1970 g->global_vars.append(tld_var->var);
1970 g->global_vars.append(tld_var);
19711971}
19721972
19731973static void resolve_decl_typedef(CodeGen *g, TldTypeDef *tld_typedef) {
src/ast_render.cpp+3-1
......@@ -628,6 +628,7 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) {
628628 if (entry->type == NodeTypeStructValueField) {
629629 Buf *name = entry->data.struct_val_field.name;
630630 AstNode *expr = entry->data.struct_val_field.expr;
631 print_indent(ar);
631632 fprintf(ar->f, ".%s = ", buf_ptr(name));
632633 render_node_grouped(ar, expr);
633634 fprintf(ar->f, ",\n");
......@@ -637,10 +638,11 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) {
637638 render_node_grouped(ar, entry);
638639 }
639640 }
640 fprintf(ar->f, "}");
641641 if (node->data.container_init_expr.kind == ContainerInitKindStruct) {
642642 ar->indent -= ar->indent_size;
643643 }
644 print_indent(ar);
645 fprintf(ar->f, "}");
644646 break;
645647 case NodeTypeArrayType:
646648 {
src/codegen.cpp+6-5
......@@ -2808,7 +2808,8 @@ static void do_code_gen(CodeGen *g) {
28082808
28092809 // Generate module level variables
28102810 for (size_t i = 0; i < g->global_vars.length; i += 1) {
2811 VariableTableEntry *var = g->global_vars.at(i);
2811 TldVar *tld_var = g->global_vars.at(i);
2812 VariableTableEntry *var = tld_var->var;
28122813
28132814 if (var->value.type->id == TypeTableEntryIdNumLitFloat) {
28142815 // Generate debug info for it but that's it.
......@@ -2852,11 +2853,11 @@ static void do_code_gen(CodeGen *g) {
28522853 if (var->linkage == VarLinkageExport) {
28532854 LLVMSetLinkage(global_value, LLVMExternalLinkage);
28542855 }
2855 if (var->section_name) {
2856 LLVMSetSection(global_value, buf_ptr(var->section_name));
2856 if (tld_var->section_name) {
2857 LLVMSetSection(global_value, buf_ptr(tld_var->section_name));
28572858 }
2858 if (var->alignment) {
2859 LLVMSetAlignment(global_value, var->alignment);
2859 if (tld_var->alignment) {
2860 LLVMSetAlignment(global_value, tld_var->alignment);
28602861 }
28612862
28622863 // TODO debug info for function pointers
src/ir.cpp+18-17
......@@ -2062,11 +2062,11 @@ static IrInstruction *ir_build_can_implicit_cast(IrBuilder *irb, Scope *scope, A
20622062}
20632063
20642064static IrInstruction *ir_build_set_global_align(IrBuilder *irb, Scope *scope, AstNode *source_node,
2065 VariableTableEntry *var, IrInstruction *value)
2065 TldVar *tld_var, IrInstruction *value)
20662066{
20672067 IrInstructionSetGlobalAlign *instruction = ir_build_instruction<IrInstructionSetGlobalAlign>(
20682068 irb, scope, source_node);
2069 instruction->var = var;
2069 instruction->tld_var = tld_var;
20702070 instruction->value = value;
20712071
20722072 ir_ref_instruction(value, irb->current_basic_block);
......@@ -2075,11 +2075,11 @@ static IrInstruction *ir_build_set_global_align(IrBuilder *irb, Scope *scope, As
20752075}
20762076
20772077static IrInstruction *ir_build_set_global_section(IrBuilder *irb, Scope *scope, AstNode *source_node,
2078 VariableTableEntry *var, IrInstruction *value)
2078 TldVar *tld_var, IrInstruction *value)
20792079{
20802080 IrInstructionSetGlobalSection *instruction = ir_build_instruction<IrInstructionSetGlobalSection>(
20812081 irb, scope, source_node);
2082 instruction->var = var;
2082 instruction->tld_var = tld_var;
20832083 instruction->value = value;
20842084
20852085 ir_ref_instruction(value, irb->current_basic_block);
......@@ -4187,7 +4187,6 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
41874187 return irb->codegen->invalid_instruction;
41884188 }
41894189 TldVar *tld_var = (TldVar *)tld;
4190 VariableTableEntry *var = tld_var->var;
41914190
41924191 AstNode *arg1_node = node->data.fn_call_expr.params.at(1);
41934192 IrInstruction *arg1_value = ir_gen_node(irb, arg1_node, scope);
......@@ -4195,9 +4194,9 @@ static IrInstruction *ir_gen_builtin_fn_call(IrBuilder *irb, Scope *scope, AstNo
41954194 return arg1_value;
41964195
41974196 if (builtin_fn->id == BuiltinFnIdSetGlobalAlign) {
4198 return ir_build_set_global_align(irb, scope, node, var, arg1_value);
4197 return ir_build_set_global_align(irb, scope, node, tld_var, arg1_value);
41994198 } else {
4200 return ir_build_set_global_section(irb, scope, node, var, arg1_value);
4199 return ir_build_set_global_section(irb, scope, node, tld_var, arg1_value);
42014200 }
42024201 }
42034202 case BuiltinFnIdVolatileStore:
......@@ -9455,22 +9454,24 @@ static TypeTableEntry *ir_analyze_instruction_set_fn_visible(IrAnalyze *ira,
94559454static TypeTableEntry *ir_analyze_instruction_set_global_align(IrAnalyze *ira,
94569455 IrInstructionSetGlobalAlign *instruction)
94579456{
9458 VariableTableEntry *var = instruction->var;
9457 TldVar *tld_var = instruction->tld_var;
94599458 IrInstruction *align_value = instruction->value->other;
94609459
94619460 uint64_t scalar_align;
94629461 if (!ir_resolve_usize(ira, align_value, &scalar_align))
94639462 return ira->codegen->builtin_types.entry_invalid;
94649463
9464 // TODO error if not power of 2
9465
94659466 AstNode *source_node = instruction->base.source_node;
9466 if (var->set_global_align_node) {
9467 if (tld_var->set_global_align_node) {
94679468 ErrorMsg *msg = ir_add_error_node(ira, source_node,
94689469 buf_sprintf("alignment set twice"));
9469 add_error_note(ira->codegen, msg, var->set_global_align_node, buf_sprintf("first set here"));
9470 add_error_note(ira->codegen, msg, tld_var->set_global_align_node, buf_sprintf("first set here"));
94709471 return ira->codegen->builtin_types.entry_invalid;
94719472 }
9472 var->set_global_align_node = source_node;
9473 var->alignment = scalar_align;
9473 tld_var->set_global_align_node = source_node;
9474 tld_var->alignment = scalar_align;
94749475
94759476 ir_build_const_from(ira, &instruction->base, false);
94769477 return ira->codegen->builtin_types.entry_void;
......@@ -9479,7 +9480,7 @@ static TypeTableEntry *ir_analyze_instruction_set_global_align(IrAnalyze *ira,
94799480static TypeTableEntry *ir_analyze_instruction_set_global_section(IrAnalyze *ira,
94809481 IrInstructionSetGlobalSection *instruction)
94819482{
9482 VariableTableEntry *var = instruction->var;
9483 TldVar *tld_var = instruction->tld_var;
94839484 IrInstruction *section_value = instruction->value->other;
94849485
94859486 Buf *section_name = ir_resolve_str(ira, section_value);
......@@ -9487,13 +9488,13 @@ static TypeTableEntry *ir_analyze_instruction_set_global_section(IrAnalyze *ira,
94879488 return ira->codegen->builtin_types.entry_invalid;
94889489
94899490 AstNode *source_node = instruction->base.source_node;
9490 if (var->set_global_section_node) {
9491 if (tld_var->set_global_section_node) {
94919492 ErrorMsg *msg = ir_add_error_node(ira, source_node, buf_sprintf("section set twice"));
9492 add_error_note(ira->codegen, msg, var->set_global_section_node, buf_sprintf("first set here"));
9493 add_error_note(ira->codegen, msg, tld_var->set_global_section_node, buf_sprintf("first set here"));
94939494 return ira->codegen->builtin_types.entry_invalid;
94949495 }
9495 var->set_global_section_node = source_node;
9496 var->section_name = section_name;
9496 tld_var->set_global_section_node = source_node;
9497 tld_var->section_name = section_name;
94979498
94989499 ir_build_const_from(ira, &instruction->base, false);
94999500 return ira->codegen->builtin_types.entry_void;
src/ir_print.cpp+2-2
......@@ -835,13 +835,13 @@ static void ir_print_can_implicit_cast(IrPrint *irp, IrInstructionCanImplicitCas
835835}
836836
837837static void ir_print_set_global_align(IrPrint *irp, IrInstructionSetGlobalAlign *instruction) {
838 fprintf(irp->f, "@setGlobalAlign(%s,", buf_ptr(&instruction->var->name));
838 fprintf(irp->f, "@setGlobalAlign(%s,", buf_ptr(instruction->tld_var->base.name));
839839 ir_print_other_instruction(irp, instruction->value);
840840 fprintf(irp->f, ")");
841841}
842842
843843static void ir_print_set_global_section(IrPrint *irp, IrInstructionSetGlobalSection *instruction) {
844 fprintf(irp->f, "@setGlobalSection(%s,", buf_ptr(&instruction->var->name));
844 fprintf(irp->f, "@setGlobalSection(%s,", buf_ptr(instruction->tld_var->base.name));
845845 ir_print_other_instruction(irp, instruction->value);
846846 fprintf(irp->f, ")");
847847}
src/parseh.cpp+1-1
......@@ -152,7 +152,7 @@ static TldVar *create_global_var(Context *c, Buf *name, ConstExprValue *var_valu
152152 TldVar *tld_var = allocate<TldVar>(1);
153153 parseh_init_tld(c, &tld_var->base, TldIdVar, name);
154154 tld_var->var = add_variable(c->codegen, c->source_node, &c->import->decls_scope->base, name, is_const, var_value);
155 c->codegen->global_vars.append(tld_var->var);
155 c->codegen->global_vars.append(tld_var);
156156 return tld_var;
157157}
158158