| ... | @@ -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, // TODO | 13040 | .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 | }; |
| 13399 | | 13405 | |
| 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( |
| 13946 | | 13952 | |
| 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); |
| 13957 | | 13968 | |
| 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 | } |
| 13963 | | 13974 | |
| 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 | }; |
| 13971 | | 13982 | |