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