authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-02-12 01:23:06-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-02-12 01:23:06-07:00
log0c1ce21f7d5f2756bc9e642c17092db9f9f2cf05
tree1a84a6d707b8d427665b5fe7c31c41886359c2ea
parent51b2621e6201fa182f166783e79a47f49c04d5cf

add @compile_var("environ")


3 files changed, 30 insertions(+), 0 deletions(-)

src/all_types.hpp+2
......@@ -1110,6 +1110,7 @@ struct CodeGen {
11101110 TypeTableEntry *entry_pure_error;
11111111 TypeTableEntry *entry_os_enum;
11121112 TypeTableEntry *entry_arch_enum;
1113 TypeTableEntry *entry_environ_enum;
11131114 } builtin_types;
11141115
11151116 ZigTarget zig_target;
......@@ -1130,6 +1131,7 @@ struct CodeGen {
11301131 bool is_test_build;
11311132 uint32_t target_os_index;
11321133 uint32_t target_arch_index;
1134 uint32_t target_environ_index;
11331135 LLVMTargetMachineRef target_machine;
11341136 LLVMZigDIFile *dummy_di_file;
11351137 bool is_native_target;
src/analyze.cpp+3
......@@ -4250,6 +4250,9 @@ static TypeTableEntry *analyze_builtin_fn_call_expr(CodeGen *g, ImportTableEntry
42504250 } else if (buf_eql_str(&var_name, "arch")) {
42514251 const_val->data.x_enum.tag = g->target_arch_index;
42524252 return g->builtin_types.entry_arch_enum;
4253 } else if (buf_eql_str(&var_name, "environ")) {
4254 const_val->data.x_enum.tag = g->target_environ_index;
4255 return g->builtin_types.entry_environ_enum;
42534256 } else {
42544257 add_node_error(g, *str_node,
42554258 buf_sprintf("unrecognized compile variable: '%s'", buf_ptr(&var_name)));
src/codegen.cpp+25
......@@ -3500,6 +3500,31 @@ static void define_builtin_types(CodeGen *g) {
35003500
35013501 g->builtin_types.entry_arch_enum = entry;
35023502 }
3503
3504 {
3505 TypeTableEntry *entry = new_type_table_entry(TypeTableEntryIdEnum);
3506 entry->zero_bits = true; // only allowed at compile time
3507 buf_init_from_str(&entry->name, "@Environ");
3508 uint32_t field_count = target_environ_count();
3509 entry->data.enumeration.field_count = field_count;
3510 entry->data.enumeration.fields = allocate<TypeEnumField>(field_count);
3511 for (uint32_t i = 0; i < field_count; i += 1) {
3512 TypeEnumField *type_enum_field = &entry->data.enumeration.fields[i];
3513 ZigLLVM_EnvironmentType environ_type = get_target_environ(i);
3514 type_enum_field->name = buf_create_from_str(ZigLLVMGetEnvironmentTypeName(environ_type));
3515 type_enum_field->value = i;
3516
3517 if (environ_type == g->zig_target.environ) {
3518 g->target_environ_index = i;
3519 }
3520 }
3521 entry->data.enumeration.complete = true;
3522
3523 TypeTableEntry *tag_type_entry = get_smallest_unsigned_int_type(g, field_count);
3524 entry->data.enumeration.tag_type = tag_type_entry;
3525
3526 g->builtin_types.entry_environ_enum = entry;
3527 }
35033528}
35043529
35053530