authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-03-02 12:25:44+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-03-02 12:25:44+02:00
log58530c17364d2525655c90e97fd2cdd2937e5c19
tree3494dc8578e548a6ecf3eb9643a9112a1a9fc02d
parentef4aca2dc4224d0de1ab15112097fd48930476db

stage2: resolve options values


1 files changed, 41 insertions(+), 30 deletions(-)

src/Sema.zig+41-30
...@@ -13019,20 +13019,24 @@ fn resolveExportOptions(...@@ -13019,20 +13019,24 @@ fn resolveExportOptions(
13019) CompileError!std.builtin.ExportOptions {13019) CompileError!std.builtin.ExportOptions {
13020 const export_options_ty = try sema.getBuiltinType(block, src, "ExportOptions");13020 const export_options_ty = try sema.getBuiltinType(block, src, "ExportOptions");
13021 const air_ref = sema.resolveInst(zir_ref);13021 const air_ref = sema.resolveInst(zir_ref);
13022 const coerced = try sema.coerce(block, export_options_ty, air_ref, src);13022 const options = try sema.coerce(block, export_options_ty, air_ref, src);
13023 const val = try sema.resolveConstValue(block, src, coerced);13023
13024 const fields = val.castTag(.@"struct").?.data;13024 const name = try sema.fieldVal(block, src, options, "name", src);
13025 const struct_obj = export_options_ty.castTag(.@"struct").?.data;13025 const name_val = try sema.resolveConstValue(block, src, name);
13026 const name_index = struct_obj.fields.getIndex("name").?;13026
13027 const linkage_index = struct_obj.fields.getIndex("linkage").?;13027 const linkage = try sema.fieldVal(block, src, options, "linkage", src);
13028 const section_index = struct_obj.fields.getIndex("section").?;13028 const linkage_val = try sema.resolveConstValue(block, src, linkage);
13029 if (!fields[section_index].isNull()) {13029
13030 const section = try sema.fieldVal(block, src, options, "section", src);
13031 const section_val = try sema.resolveConstValue(block, src, section);
13032
13033 if (!section_val.isNull()) {
13030 return sema.fail(block, src, "TODO: implement exporting with linksection", .{});13034 return sema.fail(block, src, "TODO: implement exporting with linksection", .{});
13031 }13035 }
13032 const name_ty = Type.initTag(.const_slice_u8);13036 const name_ty = Type.initTag(.const_slice_u8);
13033 return std.builtin.ExportOptions{13037 return std.builtin.ExportOptions{
13034 .name = try fields[name_index].toAllocatedBytes(name_ty, sema.arena),13038 .name = try name_val.toAllocatedBytes(name_ty, sema.arena),
13035 .linkage = fields[linkage_index].toEnum(std.builtin.GlobalLinkage),13039 .linkage = linkage_val.toEnum(std.builtin.GlobalLinkage),
13036 .section = null, // TODO13040 .section = null, // TODO
13037 };13041 };
13038}13042}
...@@ -13386,15 +13390,17 @@ fn zirBuiltinCall(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError...@@ -13386,15 +13390,17 @@ fn zirBuiltinCall(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
13386 const modifier: std.builtin.CallOptions.Modifier = modifier: {13390 const modifier: std.builtin.CallOptions.Modifier = modifier: {
13387 const call_options_ty = try sema.getBuiltinType(block, options_src, "CallOptions");13391 const call_options_ty = try sema.getBuiltinType(block, options_src, "CallOptions");
13388 const coerced_options = try sema.coerce(block, call_options_ty, options, options_src);13392 const coerced_options = try sema.coerce(block, call_options_ty, options, options_src);
13389 const options_val = try sema.resolveConstValue(block, options_src, coerced_options);13393
13390 const fields = options_val.castTag(.@"struct").?.data;13394 const modifier = try sema.fieldVal(block, options_src, coerced_options, "modifier", options_src);
13391 const struct_obj = call_options_ty.castTag(.@"struct").?.data;13395 const modifier_val = try sema.resolveConstValue(block, options_src, modifier);
13392 const modifier_index = struct_obj.fields.getIndex("modifier").?;13396
13393 const stack_index = struct_obj.fields.getIndex("stack").?;13397 const stack = try sema.fieldVal(block, options_src, coerced_options, "stack", options_src);
13394 if (!fields[stack_index].isNull()) {13398 const stack_val = try sema.resolveConstValue(block, options_src, stack);
13399
13400 if (!stack_val.isNull()) {
13395 return sema.fail(block, options_src, "TODO: implement @call with stack", .{});13401 return sema.fail(block, options_src, "TODO: implement @call with stack", .{});
13396 }13402 }
13397 break :modifier fields[modifier_index].toEnum(std.builtin.CallOptions.Modifier);13403 break :modifier modifier_val.toEnum(std.builtin.CallOptions.Modifier);
13398 };13404 };
1339913405
13400 const args_ty = sema.typeOf(args);13406 const args_ty = sema.typeOf(args);
...@@ -13946,26 +13952,31 @@ fn zirBuiltinExtern(...@@ -13946,26 +13952,31 @@ fn zirBuiltinExtern(
1394613952
13947 const options = options: {13953 const options = options: {
13948 const extern_options_ty = try sema.getBuiltinType(block, options_src, "ExternOptions");13954 const extern_options_ty = try sema.getBuiltinType(block, options_src, "ExternOptions");
13949 const coerced_options = try sema.coerce(block, extern_options_ty, options_inst, options_src);13955 const options = try sema.coerce(block, extern_options_ty, options_inst, options_src);
13950 const options_val = try sema.resolveConstValue(block, options_src, coerced_options);13956
13951 const fields = options_val.castTag(.@"struct").?.data;13957 const name = try sema.fieldVal(block, options_src, options, "name", options_src);
13952 const struct_obj = extern_options_ty.castTag(.@"struct").?.data;13958 const name_val = try sema.resolveConstValue(block, options_src, name);
13953 const name_index = struct_obj.fields.getIndex("name").?;13959
13954 const library_name_index = struct_obj.fields.getIndex("library_name").?;13960 const library_name_inst = try sema.fieldVal(block, options_src, options, "library_name", options_src);
13955 const linkage_index = struct_obj.fields.getIndex("linkage").?;13961 const library_name_val = try sema.resolveConstValue(block, options_src, library_name_inst);
13956 const is_thread_local_index = struct_obj.fields.getIndex("is_thread_local").?;13962
13963 const linkage = try sema.fieldVal(block, options_src, options, "linkage", options_src);
13964 const linkage_val = try sema.resolveConstValue(block, options_src, linkage);
13965
13966 const is_thread_local = try sema.fieldVal(block, options_src, options, "is_thread_local", options_src);
13967 const is_thread_local_val = try sema.resolveConstValue(block, options_src, is_thread_local);
1395713968
13958 var library_name: ?[]const u8 = null;13969 var library_name: ?[]const u8 = null;
13959 if (!fields[library_name_index].isNull()) {13970 if (!library_name_val.isNull()) {
13960 const payload = fields[library_name_index].castTag(.opt_payload).?.data;13971 const payload = library_name_val.castTag(.opt_payload).?.data;
13961 library_name = try payload.toAllocatedBytes(Type.initTag(.const_slice_u8), sema.arena);13972 library_name = try payload.toAllocatedBytes(Type.initTag(.const_slice_u8), sema.arena);
13962 }13973 }
1396313974
13964 break :options std.builtin.ExternOptions{13975 break :options std.builtin.ExternOptions{
13965 .name = try fields[name_index].toAllocatedBytes(Type.initTag(.const_slice_u8), sema.arena),13976 .name = try name_val.toAllocatedBytes(Type.initTag(.const_slice_u8), sema.arena),
13966 .library_name = library_name,13977 .library_name = library_name,
13967 .linkage = fields[linkage_index].toEnum(std.builtin.GlobalLinkage),13978 .linkage = linkage_val.toEnum(std.builtin.GlobalLinkage),
13968 .is_thread_local = fields[is_thread_local_index].toBool(),13979 .is_thread_local = is_thread_local_val.toBool(),
13969 };13980 };
13970 };13981 };
1397113982