diff --git a/src/link.cpp b/src/link.cpp index f031084409..b22b78c4f9 100644 --- a/src/link.cpp +++ b/src/link.cpp @@ -437,12 +437,26 @@ static void construct_linker_job_coff(LinkJob *lj) { } } if (buf_len(def_contents) != 0) { - Buf *dll_path = buf_alloc(); - os_path_join(g->cache_dir, buf_create_from_str("all.dll"), dll_path); - ZigLLDDefToLib(def_contents, dll_path); + Buf *def_path = buf_alloc(); + os_path_join(g->cache_dir, buf_create_from_str("all.def"), def_path); + os_write_file(def_path, def_contents); Buf *all_lib_path = buf_alloc(); os_path_join(g->cache_dir, buf_create_from_str("all.lib"), all_lib_path); + + //Buf *dll_path = buf_alloc(); + //os_path_join(g->cache_dir, buf_create_from_str("all.dll"), dll_path); + + ZigList args = {0}; + args.append("link"); + args.append(buf_ptr(buf_sprintf("-DEF:%s", buf_ptr(def_path)))); + args.append(buf_ptr(buf_sprintf("-OUT:%s", buf_ptr(all_lib_path)))); + Buf diag = BUF_INIT; + if (!ZigLLDLink(g->zig_target.oformat, args.items, args.length, &diag)) { + fprintf(stderr, "%s\n", buf_ptr(&diag)); + exit(1); + } + lj->args.append(buf_ptr(all_lib_path)); } @@ -732,6 +746,8 @@ static void construct_linker_job(LinkJob *lj) { return construct_linker_job_elf(lj); case ZigLLVM_MachO: return construct_linker_job_macho(lj); + case ZigLLVM_Wasm: + zig_panic("TODO link wasm"); } } diff --git a/src/parseh.cpp b/src/parseh.cpp index fa474850b2..cb51ccb327 100644 --- a/src/parseh.cpp +++ b/src/parseh.cpp @@ -341,7 +341,6 @@ static TypeTableEntry *resolve_type_with_table(Context *c, const Type *ty, const case BuiltinType::OCLEvent: case BuiltinType::OCLClkEvent: case BuiltinType::OCLQueue: - case BuiltinType::OCLNDRange: case BuiltinType::OCLReserveID: emit_warning(c, decl, "missed a builtin type"); return c->codegen->builtin_types.entry_invalid; @@ -445,8 +444,8 @@ static TypeTableEntry *resolve_type_with_table(Context *c, const Type *ty, const case CC_X86Pascal: // __attribute__((pascal)) emit_warning(c, decl, "function type has x86 pascal calling convention"); return c->codegen->builtin_types.entry_invalid; - case CC_X86_64Win64: // __attribute__((ms_abi)) - emit_warning(c, decl, "function type has x86 64win64 calling convention"); + case CC_Win64: // __attribute__((ms_abi)) + emit_warning(c, decl, "function type has win64 calling convention"); return c->codegen->builtin_types.entry_invalid; case CC_X86_64SysV: // __attribute__((sysv_abi)) emit_warning(c, decl, "function type has x86 64sysv calling convention"); @@ -586,6 +585,7 @@ static TypeTableEntry *resolve_type_with_table(Context *c, const Type *ty, const case Type::Atomic: case Type::Pipe: case Type::ObjCTypeParam: + case Type::DeducedTemplateSpecialization: emit_warning(c, decl, "missed a '%s' type", ty->getTypeClassName()); return c->codegen->builtin_types.entry_invalid; } @@ -1369,6 +1369,8 @@ int parse_h_file(ImportTableEntry *import, ZigList *errors, const ch bool capture_diagnostics = true; bool user_files_are_volatile = true; bool allow_pch_with_compiler_errors = false; + bool single_file_parse = false; + bool for_serialization = false; const char *resources_path = ZIG_HEADERS_DIR; std::unique_ptr err_unit; std::unique_ptr ast_unit(ASTUnit::LoadFromCommandLine( @@ -1376,7 +1378,8 @@ int parse_h_file(ImportTableEntry *import, ZigList *errors, const ch pch_container_ops, diags, resources_path, only_local_decls, capture_diagnostics, None, true, 0, TU_Complete, false, false, allow_pch_with_compiler_errors, skip_function_bodies, - user_files_are_volatile, false, None, &err_unit)); + single_file_parse, user_files_are_volatile, for_serialization, None, &err_unit, + nullptr)); // Early failures in LoadFromCommandLine may return with ErrUnit unset. diff --git a/src/target.cpp b/src/target.cpp index adcc288b64..5aea3ce34d 100644 --- a/src/target.cpp +++ b/src/target.cpp @@ -24,6 +24,7 @@ static const ArchType arch_list[] = { {ZigLLVM_arm, ZigLLVM_ARMSubArch_v7m}, {ZigLLVM_arm, ZigLLVM_ARMSubArch_v7s}, {ZigLLVM_arm, ZigLLVM_ARMSubArch_v7k}, + {ZigLLVM_arm, ZigLLVM_ARMSubArch_v7ve}, {ZigLLVM_arm, ZigLLVM_ARMSubArch_v6}, {ZigLLVM_arm, ZigLLVM_ARMSubArch_v6m}, {ZigLLVM_arm, ZigLLVM_ARMSubArch_v6k}, @@ -44,6 +45,7 @@ static const ArchType arch_list[] = { {ZigLLVM_mips64, ZigLLVM_NoSubArch}, {ZigLLVM_mips64el, ZigLLVM_NoSubArch}, {ZigLLVM_msp430, ZigLLVM_NoSubArch}, + {ZigLLVM_nios2, ZigLLVM_NoSubArch}, {ZigLLVM_ppc, ZigLLVM_NoSubArch}, {ZigLLVM_ppc64, ZigLLVM_NoSubArch}, {ZigLLVM_ppc64le, ZigLLVM_NoSubArch}, @@ -100,10 +102,12 @@ static const ZigLLVM_VendorType vendor_list[] = { ZigLLVM_Myriad, ZigLLVM_AMD, ZigLLVM_Mesa, + ZigLLVM_SUSE, }; static const ZigLLVM_OSType os_list[] = { ZigLLVM_UnknownOS, + ZigLLVM_Ananas, ZigLLVM_CloudABI, ZigLLVM_Darwin, ZigLLVM_DragonFly, @@ -156,6 +160,7 @@ static const ZigLLVM_EnvironmentType environ_list[] = { ZigLLVM_Cygnus, ZigLLVM_AMDOpenCL, ZigLLVM_CoreCLR, + ZigLLVM_OpenCL, }; static const ZigLLVM_ObjectFormatType oformat_list[] = { @@ -163,6 +168,7 @@ static const ZigLLVM_ObjectFormatType oformat_list[] = { ZigLLVM_COFF, ZigLLVM_ELF, ZigLLVM_MachO, + ZigLLVM_Wasm, }; size_t target_oformat_count(void) { @@ -179,6 +185,7 @@ const char *get_target_oformat_name(ZigLLVM_ObjectFormatType oformat) { case ZigLLVM_COFF: return "coff"; case ZigLLVM_ELF: return "elf"; case ZigLLVM_MachO: return "macho"; + case ZigLLVM_Wasm: return "wasm"; } zig_unreachable(); } @@ -353,6 +360,7 @@ void resolve_target_object_format(ZigTarget *target) { case ZigLLVM_mips64el: case ZigLLVM_mipsel: case ZigLLVM_msp430: + case ZigLLVM_nios2: case ZigLLVM_nvptx: case ZigLLVM_nvptx64: case ZigLLVM_ppc64le: @@ -389,6 +397,7 @@ void resolve_target_object_format(ZigTarget *target) { } // See lib/Support/Triple.cpp in LLVM for the source of this data. +// getArchPointerBitWidth static int get_arch_pointer_bit_width(ZigLLVM_ArchType arch) { switch (arch) { case ZigLLVM_UnknownArch: @@ -404,6 +413,7 @@ static int get_arch_pointer_bit_width(ZigLLVM_ArchType arch) { case ZigLLVM_le32: case ZigLLVM_mips: case ZigLLVM_mipsel: + case ZigLLVM_nios2: case ZigLLVM_nvptx: case ZigLLVM_ppc: case ZigLLVM_r600: @@ -504,6 +514,7 @@ uint32_t target_c_type_size_in_bits(const ZigTarget *target, CIntType id) { case CIntTypeCount: zig_unreachable(); } + case ZigLLVM_Ananas: case ZigLLVM_CloudABI: case ZigLLVM_DragonFly: case ZigLLVM_FreeBSD: diff --git a/src/zig_llvm.cpp b/src/zig_llvm.cpp index d9a35e4c4a..4f37444a3b 100644 --- a/src/zig_llvm.cpp +++ b/src/zig_llvm.cpp @@ -38,7 +38,6 @@ #include #include #include -#include #include #include #include @@ -105,11 +104,9 @@ bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMM PMBuilder->DisableTailCalls = is_debug; PMBuilder->DisableUnitAtATime = is_debug; PMBuilder->DisableUnrollLoops = is_debug; - PMBuilder->BBVectorize = !is_debug; PMBuilder->SLPVectorize = !is_debug; PMBuilder->LoopVectorize = !is_debug; PMBuilder->RerollLoops = !is_debug; - PMBuilder->LoadCombine = !is_debug; PMBuilder->NewGVN = !is_debug; PMBuilder->DisableGVNLoadPRE = is_debug; PMBuilder->VerifyInput = assertions_on; @@ -125,13 +122,10 @@ bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMM if (is_debug) { PMBuilder->Inliner = createAlwaysInlinerLegacyPass(false); } else { - PMBuilder->addExtension(PassManagerBuilder::EP_EarlyAsPossible, - [&](const PassManagerBuilder &, legacy::PassManagerBase &PM) { - target_machine->addEarlyAsPossiblePasses(PM); - }); + target_machine->adjustPassManager(*PMBuilder); PMBuilder->addExtension(PassManagerBuilder::EP_EarlyAsPossible, addDiscriminatorsPass); - PMBuilder->Inliner = createFunctionInliningPass(PMBuilder->OptLevel, PMBuilder->SizeLevel); + PMBuilder->Inliner = createFunctionInliningPass(PMBuilder->OptLevel, PMBuilder->SizeLevel, false); } // Set up the per-function pass manager. @@ -182,7 +176,7 @@ LLVMValueRef ZigLLVMBuildCall(LLVMBuilderRef B, LLVMValueRef Fn, LLVMValueRef *A CallInst *call_inst = CallInst::Create(unwrap(Fn), makeArrayRef(unwrap(Args), NumArgs), Name); call_inst->setCallingConv(CC); if (always_inline) { - call_inst->addAttribute(AttributeSet::FunctionIndex, Attribute::AlwaysInline); + call_inst->addAttribute(AttributeList::FunctionIndex, Attribute::AlwaysInline); } return wrap(unwrap(B)->Insert(call_inst)); } @@ -198,7 +192,7 @@ ZigLLVMDIType *ZigLLVMCreateDebugPointerType(ZigLLVMDIBuilder *dibuilder, ZigLLV uint64_t size_in_bits, uint64_t align_in_bits, const char *name) { DIType *di_type = reinterpret_cast(dibuilder)->createPointerType( - reinterpret_cast(pointee_type), size_in_bits, align_in_bits, name); + reinterpret_cast(pointee_type), size_in_bits, align_in_bits, Optional(), name); return reinterpret_cast(di_type); } @@ -599,23 +593,22 @@ void ZigLLVMSetFastMath(LLVMBuilderRef builder_wrapped, bool on_state) { void ZigLLVMAddFunctionAttr(LLVMValueRef fn_ref, const char *attr_name, const char *attr_value) { Function *func = unwrap(fn_ref); - const AttributeSet attr_set = func->getAttributes(); + const AttributeList attr_set = func->getAttributes(); AttrBuilder attr_builder; if (attr_value) { attr_builder.addAttribute(attr_name, attr_value); } else { attr_builder.addAttribute(attr_name); } - const AttributeSet new_attr_set = attr_set.addAttributes(func->getContext(), - AttributeSet::FunctionIndex, AttributeSet::get(func->getContext(), - AttributeSet::FunctionIndex, attr_builder)); + const AttributeList new_attr_set = attr_set.addAttributes(func->getContext(), + AttributeList::FunctionIndex, attr_builder); func->setAttributes(new_attr_set); } void ZigLLVMAddFunctionAttrCold(LLVMValueRef fn_ref) { Function *func = unwrap(fn_ref); - const AttributeSet attr_set = func->getAttributes(); - const AttributeSet new_attr_set = attr_set.addAttribute(func->getContext(), AttributeSet::FunctionIndex, + const AttributeList attr_set = func->getAttributes(); + const AttributeList new_attr_set = attr_set.addAttribute(func->getContext(), AttributeList::FunctionIndex, Attribute::Cold); func->setAttributes(new_attr_set); } @@ -690,6 +683,8 @@ const char *ZigLLVMGetSubArchTypeName(ZigLLVM_SubArchType sub_arch) { return "v7s"; case ZigLLVM_ARMSubArch_v7k: return "v7k"; + case ZigLLVM_ARMSubArch_v7ve: + return "v7ve"; case ZigLLVM_ARMSubArch_v6: return "v6"; case ZigLLVM_ARMSubArch_v6m: @@ -741,8 +736,7 @@ LLVMValueRef ZigLLVMBuildCmpXchg(LLVMBuilderRef builder, LLVMValueRef ptr, LLVMV LLVMAtomicOrdering failure_ordering) { return wrap(unwrap(builder)->CreateAtomicCmpXchg(unwrap(ptr), unwrap(cmp), unwrap(new_val), - mapFromLLVMOrdering(success_ordering), mapFromLLVMOrdering(failure_ordering), - CrossThread)); + mapFromLLVMOrdering(success_ordering), mapFromLLVMOrdering(failure_ordering))); } LLVMValueRef ZigLLVMBuildNSWShl(LLVMBuilderRef builder, LLVMValueRef LHS, LLVMValueRef RHS, @@ -802,154 +796,9 @@ bool ZigLLDLink(ZigLLVM_ObjectFormatType oformat, const char **args, size_t arg_ case ZigLLVM_MachO: return lld::mach_o::link(array_ref_args, diag); + + case ZigLLVM_Wasm: + zig_panic("ZigLLDLink for Wasm"); } zig_unreachable(); } - -// workaround for LLD not exposing ability to convert .def to .lib - -#include - -namespace lld { -namespace coff { - -class SymbolBody; -class StringChunk; -struct Symbol; - -struct Export { - StringRef Name; // N in /export:N or /export:E=N - StringRef ExtName; // E in /export:E=N - SymbolBody *Sym = nullptr; - uint16_t Ordinal = 0; - bool Noname = false; - bool Data = false; - bool Private = false; - - // If an export is a form of /export:foo=dllname.bar, that means - // that foo should be exported as an alias to bar in the DLL. - // ForwardTo is set to "dllname.bar" part. Usually empty. - StringRef ForwardTo; - StringChunk *ForwardChunk = nullptr; - - // True if this /export option was in .drectves section. - bool Directives = false; - StringRef SymbolName; - StringRef ExportName; // Name in DLL - - bool operator==(const Export &E) { - return (Name == E.Name && ExtName == E.ExtName && - Ordinal == E.Ordinal && Noname == E.Noname && - Data == E.Data && Private == E.Private); - } -}; - -enum class DebugType { - None = 0x0, - CV = 0x1, /// CodeView - PData = 0x2, /// Procedure Data - Fixup = 0x4, /// Relocation Table -}; - -struct Configuration { - enum ManifestKind { SideBySide, Embed, No }; - llvm::COFF::MachineTypes Machine = llvm::COFF::IMAGE_FILE_MACHINE_UNKNOWN; - bool Verbose = false; - llvm::COFF::WindowsSubsystem Subsystem = llvm::COFF::IMAGE_SUBSYSTEM_UNKNOWN; - SymbolBody *Entry = nullptr; - bool NoEntry = false; - std::string OutputFile; - bool DoGC = true; - bool DoICF = true; - bool Relocatable = true; - bool Force = false; - bool Debug = false; - bool WriteSymtab = true; - unsigned DebugTypes = static_cast(DebugType::None); - StringRef PDBPath; - - // Symbols in this set are considered as live by the garbage collector. - std::set GCRoot; - - std::set NoDefaultLibs; - bool NoDefaultLibAll = false; - - // True if we are creating a DLL. - bool DLL = false; - StringRef Implib; - std::vector Exports; - std::set DelayLoads; - std::map DLLOrder; - SymbolBody *DelayLoadHelper = nullptr; - - // Used for SafeSEH. - Symbol *SEHTable = nullptr; - Symbol *SEHCount = nullptr; - - // Used for /opt:lldlto=N - unsigned LTOOptLevel = 2; - - // Used for /opt:lldltojobs=N - unsigned LTOJobs = 1; - - // Used for /merge:from=to (e.g. /merge:.rdata=.text) - std::map Merge; - - // Used for /section=.name,{DEKPRSW} to set section attributes. - std::map Section; - - // Options for manifest files. - ManifestKind Manifest = SideBySide; - int ManifestID = 1; - StringRef ManifestDependency; - bool ManifestUAC = true; - std::vector ManifestInput; - StringRef ManifestLevel = "'asInvoker'"; - StringRef ManifestUIAccess = "'false'"; - StringRef ManifestFile; - - // Used for /failifmismatch. - std::map MustMatch; - - // Used for /alternatename. - std::map AlternateNames; - - uint64_t ImageBase = -1; - uint64_t StackReserve = 1024 * 1024; - uint64_t StackCommit = 4096; - uint64_t HeapReserve = 1024 * 1024; - uint64_t HeapCommit = 4096; - uint32_t MajorImageVersion = 0; - uint32_t MinorImageVersion = 0; - uint32_t MajorOSVersion = 6; - uint32_t MinorOSVersion = 0; - bool DynamicBase = true; - bool AllowBind = true; - bool NxCompat = true; - bool AllowIsolation = true; - bool TerminalServerAware = true; - bool LargeAddressAware = false; - bool HighEntropyVA = false; - - // This is for debugging. - bool DebugPdb = false; - bool DumpPdb = false; -}; - -extern Configuration *Config; - -void writeImportLibrary(); -void parseModuleDefs(MemoryBufferRef MB); - -} // namespace coff -} // namespace lld - -// writes the output to dll_path with .dll replaced with .lib -void ZigLLDDefToLib(Buf *def_contents, Buf *dll_path) { - lld::coff::Config = new lld::coff::Configuration; - auto mem_buf = MemoryBuffer::getMemBuffer(buf_ptr(def_contents)); - MemoryBufferRef mbref(*mem_buf); - lld::coff::parseModuleDefs(mbref); - lld::coff::Config->OutputFile = buf_ptr(dll_path); - lld::coff::writeImportLibrary(); -} diff --git a/src/zig_llvm.hpp b/src/zig_llvm.hpp index fe3468a9b8..ded420fd5b 100644 --- a/src/zig_llvm.hpp +++ b/src/zig_llvm.hpp @@ -188,6 +188,7 @@ enum ZigLLVM_ArchType { ZigLLVM_mips64, // MIPS64: mips64 ZigLLVM_mips64el, // MIPS64EL: mips64el ZigLLVM_msp430, // MSP430: msp430 + ZigLLVM_nios2, // NIOSII: nios2 ZigLLVM_ppc, // PPC: powerpc ZigLLVM_ppc64, // PPC64: powerpc64, ppu ZigLLVM_ppc64le, // PPC64LE: powerpc64le @@ -228,30 +229,31 @@ enum ZigLLVM_ArchType { }; enum ZigLLVM_SubArchType { - ZigLLVM_NoSubArch, + ZigLLVM_NoSubArch, - ZigLLVM_ARMSubArch_v8_2a, - ZigLLVM_ARMSubArch_v8_1a, - ZigLLVM_ARMSubArch_v8, - ZigLLVM_ARMSubArch_v8r, - ZigLLVM_ARMSubArch_v8m_baseline, - ZigLLVM_ARMSubArch_v8m_mainline, - ZigLLVM_ARMSubArch_v7, - ZigLLVM_ARMSubArch_v7em, - ZigLLVM_ARMSubArch_v7m, - ZigLLVM_ARMSubArch_v7s, - ZigLLVM_ARMSubArch_v7k, - ZigLLVM_ARMSubArch_v6, - ZigLLVM_ARMSubArch_v6m, - ZigLLVM_ARMSubArch_v6k, - ZigLLVM_ARMSubArch_v6t2, - ZigLLVM_ARMSubArch_v5, - ZigLLVM_ARMSubArch_v5te, - ZigLLVM_ARMSubArch_v4t, + ZigLLVM_ARMSubArch_v8_2a, + ZigLLVM_ARMSubArch_v8_1a, + ZigLLVM_ARMSubArch_v8, + ZigLLVM_ARMSubArch_v8r, + ZigLLVM_ARMSubArch_v8m_baseline, + ZigLLVM_ARMSubArch_v8m_mainline, + ZigLLVM_ARMSubArch_v7, + ZigLLVM_ARMSubArch_v7em, + ZigLLVM_ARMSubArch_v7m, + ZigLLVM_ARMSubArch_v7s, + ZigLLVM_ARMSubArch_v7k, + ZigLLVM_ARMSubArch_v7ve, + ZigLLVM_ARMSubArch_v6, + ZigLLVM_ARMSubArch_v6m, + ZigLLVM_ARMSubArch_v6k, + ZigLLVM_ARMSubArch_v6t2, + ZigLLVM_ARMSubArch_v5, + ZigLLVM_ARMSubArch_v5te, + ZigLLVM_ARMSubArch_v4t, - ZigLLVM_KalimbaSubArch_v3, - ZigLLVM_KalimbaSubArch_v4, - ZigLLVM_KalimbaSubArch_v5, + ZigLLVM_KalimbaSubArch_v3, + ZigLLVM_KalimbaSubArch_v4, + ZigLLVM_KalimbaSubArch_v5, }; enum ZigLLVM_VendorType { @@ -271,13 +273,15 @@ enum ZigLLVM_VendorType { ZigLLVM_Myriad, ZigLLVM_AMD, ZigLLVM_Mesa, + ZigLLVM_SUSE, - ZigLLVM_LastVendorType = ZigLLVM_Mesa + ZigLLVM_LastVendorType = ZigLLVM_SUSE }; enum ZigLLVM_OSType { ZigLLVM_UnknownOS, + ZigLLVM_Ananas, ZigLLVM_CloudABI, ZigLLVM_Darwin, ZigLLVM_DragonFly, @@ -344,6 +348,7 @@ enum ZigLLVM_ObjectFormatType { ZigLLVM_COFF, ZigLLVM_ELF, ZigLLVM_MachO, + ZigLLVM_Wasm, }; const char *ZigLLVMGetArchTypeName(ZigLLVM_ArchType arch); @@ -363,6 +368,4 @@ void ZigLLVMGetNativeTarget(ZigLLVM_ArchType *arch_type, ZigLLVM_SubArchType *su ZigLLVM_VendorType *vendor_type, ZigLLVM_OSType *os_type, ZigLLVM_EnvironmentType *environ_type, ZigLLVM_ObjectFormatType *oformat); -void ZigLLDDefToLib(Buf *def_contents, Buf *dll_path); - #endif diff --git a/std/debug.zig b/std/debug.zig index f147e91324..922a72e11c 100644 --- a/std/debug.zig +++ b/std/debug.zig @@ -147,6 +147,9 @@ pub fn writeStackTrace(out_stream: &io.OutStream, allocator: &mem.Allocator, tty builtin.ObjectFormat.macho => { %return out_stream.write("(stack trace unavailable for Mach-O object format)\n"); }, + builtin.ObjectFormat.wasm => { + %return out_stream.write("(stack trace unavailable for WASM object format)\n"); + }, builtin.ObjectFormat.unknown => { %return out_stream.write("(stack trace unavailable for unknown object format)\n"); },