diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2023-12-25 17:35:41 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2024-04-06 20:13:06 +0000 |
| commit | cb14a3fe5122c879eae1fb480ed7ce82a699ddb6 (patch) | |
| tree | b983a613c35ece61d561b5a9ef9cd66419f6c7fb /contrib/llvm-project/llvm/lib/Object | |
| parent | 3d68ee6cbdb244de9fab1df8a2525d2fa592571e (diff) | |
| parent | 99aabd70801bd4bc72c4942747f6d62c675112f5 (diff) | |
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Object')
3 files changed, 132 insertions, 5 deletions
diff --git a/contrib/llvm-project/llvm/lib/Object/ELFObjectFile.cpp b/contrib/llvm-project/llvm/lib/Object/ELFObjectFile.cpp index 3c86b0f25dda..95c4f9f8545d 100644 --- a/contrib/llvm-project/llvm/lib/Object/ELFObjectFile.cpp +++ b/contrib/llvm-project/llvm/lib/Object/ELFObjectFile.cpp @@ -358,6 +358,8 @@ std::optional<StringRef> ELFObjectFileBase::tryGetCPUName() const { switch (getEMachine()) { case ELF::EM_AMDGPU: return getAMDGPUCPUName(); + case ELF::EM_CUDA: + return getNVPTXCPUName(); case ELF::EM_PPC: case ELF::EM_PPC64: return StringRef("future"); @@ -517,6 +519,73 @@ StringRef ELFObjectFileBase::getAMDGPUCPUName() const { } } +StringRef ELFObjectFileBase::getNVPTXCPUName() const { + assert(getEMachine() == ELF::EM_CUDA); + unsigned SM = getPlatformFlags() & ELF::EF_CUDA_SM; + + switch (SM) { + // Fermi architecture. + case ELF::EF_CUDA_SM20: + return "sm_20"; + case ELF::EF_CUDA_SM21: + return "sm_21"; + + // Kepler architecture. + case ELF::EF_CUDA_SM30: + return "sm_30"; + case ELF::EF_CUDA_SM32: + return "sm_32"; + case ELF::EF_CUDA_SM35: + return "sm_35"; + case ELF::EF_CUDA_SM37: + return "sm_37"; + + // Maxwell architecture. + case ELF::EF_CUDA_SM50: + return "sm_50"; + case ELF::EF_CUDA_SM52: + return "sm_52"; + case ELF::EF_CUDA_SM53: + return "sm_53"; + + // Pascal architecture. + case ELF::EF_CUDA_SM60: + return "sm_60"; + case ELF::EF_CUDA_SM61: + return "sm_61"; + case ELF::EF_CUDA_SM62: + return "sm_62"; + + // Volta architecture. + case ELF::EF_CUDA_SM70: + return "sm_70"; + case ELF::EF_CUDA_SM72: + return "sm_72"; + + // Turing architecture. + case ELF::EF_CUDA_SM75: + return "sm_75"; + + // Ampere architecture. + case ELF::EF_CUDA_SM80: + return "sm_80"; + case ELF::EF_CUDA_SM86: + return "sm_86"; + case ELF::EF_CUDA_SM87: + return "sm_87"; + + // Ada architecture. + case ELF::EF_CUDA_SM89: + return "sm_89"; + + // Hopper architecture. + case ELF::EF_CUDA_SM90: + return getPlatformFlags() & ELF::EF_CUDA_ACCELERATORS ? "sm_90a" : "sm_90"; + default: + llvm_unreachable("Unknown EF_CUDA_SM value"); + } +} + // FIXME Encode from a tablegen description or target parser. void ELFObjectFileBase::setARMSubArch(Triple &TheTriple) const { if (TheTriple.getSubArch() != Triple::NoSubArch) diff --git a/contrib/llvm-project/llvm/lib/Object/ModuleSymbolTable.cpp b/contrib/llvm-project/llvm/lib/Object/ModuleSymbolTable.cpp index ab073e18cb46..07f76688fa43 100644 --- a/contrib/llvm-project/llvm/lib/Object/ModuleSymbolTable.cpp +++ b/contrib/llvm-project/llvm/lib/Object/ModuleSymbolTable.cpp @@ -16,6 +16,7 @@ #include "RecordStreamer.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringRef.h" +#include "llvm/IR/DiagnosticInfo.h" #include "llvm/IR/Function.h" #include "llvm/IR/GlobalAlias.h" #include "llvm/IR/GlobalValue.h" @@ -68,6 +69,11 @@ void ModuleSymbolTable::addModule(Module *M) { static void initializeRecordStreamer(const Module &M, function_ref<void(RecordStreamer &)> Init) { + // This function may be called twice, once for ModuleSummaryIndexAnalysis and + // the other when writing the IR symbol table. If parsing inline assembly has + // caused errors in the first run, suppress the second run. + if (M.getContext().getDiagHandlerPtr()->HasErrors) + return; StringRef InlineAsm = M.getModuleInlineAsm(); if (InlineAsm.empty()) return; @@ -95,7 +101,8 @@ initializeRecordStreamer(const Module &M, if (!MCII) return; - std::unique_ptr<MemoryBuffer> Buffer(MemoryBuffer::getMemBuffer(InlineAsm)); + std::unique_ptr<MemoryBuffer> Buffer( + MemoryBuffer::getMemBuffer(InlineAsm, "<inline asm>")); SourceMgr SrcMgr; SrcMgr.AddNewSourceBuffer(std::move(Buffer), SMLoc()); @@ -115,6 +122,13 @@ initializeRecordStreamer(const Module &M, if (!TAP) return; + MCCtx.setDiagnosticHandler([&](const SMDiagnostic &SMD, bool IsInlineAsm, + const SourceMgr &SrcMgr, + std::vector<const MDNode *> &LocInfos) { + M.getContext().diagnose( + DiagnosticInfoSrcMgr(SMD, M.getName(), IsInlineAsm, /*LocCookie=*/0)); + }); + // Module-level inline asm is assumed to use At&t syntax (see // AsmPrinter::doInitialization()). Parser->setAssemblerDialect(InlineAsm::AD_ATT); diff --git a/contrib/llvm-project/llvm/lib/Object/WasmObjectFile.cpp b/contrib/llvm-project/llvm/lib/Object/WasmObjectFile.cpp index 168fb57935d6..dfe86a45df32 100644 --- a/contrib/llvm-project/llvm/lib/Object/WasmObjectFile.cpp +++ b/contrib/llvm-project/llvm/lib/Object/WasmObjectFile.cpp @@ -265,7 +265,6 @@ static wasm::WasmTableType readTableType(WasmObjectFile::ReadContext &Ctx) { static Error readSection(WasmSection &Section, WasmObjectFile::ReadContext &Ctx, WasmSectionOrderChecker &Checker) { - Section.Offset = Ctx.Ptr - Ctx.Start; Section.Type = readUint8(Ctx); LLVM_DEBUG(dbgs() << "readSection type=" << Section.Type << "\n"); // When reading the section's size, store the size of the LEB used to encode @@ -273,6 +272,7 @@ static Error readSection(WasmSection &Section, WasmObjectFile::ReadContext &Ctx, const uint8_t *PreSizePtr = Ctx.Ptr; uint32_t Size = readVaruint32(Ctx); Section.HeaderSecSizeEncodingLen = Ctx.Ptr - PreSizePtr; + Section.Offset = Ctx.Ptr - Ctx.Start; if (Size == 0) return make_error<StringError>("zero length section", object_error::parse_failed); @@ -599,6 +599,10 @@ Error WasmObjectFile::parseLinkingSection(ReadContext &Ctx) { Error WasmObjectFile::parseLinkingSectionSymtab(ReadContext &Ctx) { uint32_t Count = readVaruint32(Ctx); + // Clear out any symbol information that was derived from the exports + // section. + LinkingData.SymbolTable.clear(); + Symbols.clear(); LinkingData.SymbolTable.reserve(Count); Symbols.reserve(Count); StringSet<> SymbolNames; @@ -1290,37 +1294,75 @@ Error WasmObjectFile::parseGlobalSection(ReadContext &Ctx) { Error WasmObjectFile::parseExportSection(ReadContext &Ctx) { uint32_t Count = readVaruint32(Ctx); Exports.reserve(Count); + LinkingData.SymbolTable.reserve(Count); + Symbols.reserve(Count); for (uint32_t I = 0; I < Count; I++) { wasm::WasmExport Ex; Ex.Name = readString(Ctx); Ex.Kind = readUint8(Ctx); Ex.Index = readVaruint32(Ctx); + const wasm::WasmSignature *Signature = nullptr; + const wasm::WasmGlobalType *GlobalType = nullptr; + const wasm::WasmTableType *TableType = nullptr; + wasm::WasmSymbolInfo Info; + Info.Name = Ex.Name; + Info.Flags = 0; switch (Ex.Kind) { - case wasm::WASM_EXTERNAL_FUNCTION: - + case wasm::WASM_EXTERNAL_FUNCTION: { if (!isDefinedFunctionIndex(Ex.Index)) return make_error<GenericBinaryError>("invalid function export", object_error::parse_failed); getDefinedFunction(Ex.Index).ExportName = Ex.Name; + Info.Kind = wasm::WASM_SYMBOL_TYPE_FUNCTION; + Info.ElementIndex = Ex.Index; + unsigned FuncIndex = Info.ElementIndex - NumImportedFunctions; + wasm::WasmFunction &Function = Functions[FuncIndex]; + Signature = &Signatures[Function.SigIndex]; break; - case wasm::WASM_EXTERNAL_GLOBAL: + } + case wasm::WASM_EXTERNAL_GLOBAL: { if (!isValidGlobalIndex(Ex.Index)) return make_error<GenericBinaryError>("invalid global export", object_error::parse_failed); + Info.Kind = wasm::WASM_SYMBOL_TYPE_DATA; + uint64_t Offset = 0; + if (isDefinedGlobalIndex(Ex.Index)) { + auto Global = getDefinedGlobal(Ex.Index); + if (!Global.InitExpr.Extended) { + auto Inst = Global.InitExpr.Inst; + if (Inst.Opcode == wasm::WASM_OPCODE_I32_CONST) { + Offset = Inst.Value.Int32; + } else if (Inst.Opcode == wasm::WASM_OPCODE_I64_CONST) { + Offset = Inst.Value.Int64; + } + } + } + Info.DataRef = wasm::WasmDataReference{0, Offset, 0}; break; + } case wasm::WASM_EXTERNAL_TAG: if (!isValidTagIndex(Ex.Index)) return make_error<GenericBinaryError>("invalid tag export", object_error::parse_failed); + Info.Kind = wasm::WASM_SYMBOL_TYPE_TAG; + Info.ElementIndex = Ex.Index; break; case wasm::WASM_EXTERNAL_MEMORY: + break; case wasm::WASM_EXTERNAL_TABLE: + Info.Kind = wasm::WASM_SYMBOL_TYPE_TABLE; break; default: return make_error<GenericBinaryError>("unexpected export kind", object_error::parse_failed); } Exports.push_back(Ex); + if (Ex.Kind != wasm::WASM_EXTERNAL_MEMORY) { + LinkingData.SymbolTable.emplace_back(Info); + Symbols.emplace_back(LinkingData.SymbolTable.back(), GlobalType, + TableType, Signature); + LLVM_DEBUG(dbgs() << "Adding symbol: " << Symbols.back() << "\n"); + } } if (Ctx.Ptr != Ctx.End) return make_error<GenericBinaryError>("export section ended prematurely", @@ -1644,6 +1686,8 @@ uint64_t WasmObjectFile::getWasmSymbolValue(const WasmSymbol &Sym) const { return Segment.Offset.Inst.Value.Int32 + Sym.Info.DataRef.Offset; } else if (Segment.Offset.Inst.Opcode == wasm::WASM_OPCODE_I64_CONST) { return Segment.Offset.Inst.Value.Int64 + Sym.Info.DataRef.Offset; + } else if (Segment.Offset.Inst.Opcode == wasm::WASM_OPCODE_GLOBAL_GET) { + return Sym.Info.DataRef.Offset; } else { llvm_unreachable("unknown init expr opcode"); } |
