diff options
Diffstat (limited to 'llvm/lib/IR')
-rw-r--r-- | llvm/lib/IR/AutoUpgrade.cpp | 59 | ||||
-rw-r--r-- | llvm/lib/IR/DebugInfo.cpp | 43 | ||||
-rw-r--r-- | llvm/lib/IR/Verifier.cpp | 5 |
3 files changed, 73 insertions, 34 deletions
diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp index f28b989..d8374b6 100644 --- a/llvm/lib/IR/AutoUpgrade.cpp +++ b/llvm/lib/IR/AutoUpgrade.cpp @@ -6041,8 +6041,7 @@ std::string llvm::UpgradeDataLayoutString(StringRef DL, StringRef TT) { Triple T(TT); // The only data layout upgrades needed for pre-GCN, SPIR or SPIRV are setting // the address space of globals to 1. This does not apply to SPIRV Logical. - if (((T.isAMDGPU() && !T.isAMDGCN()) || - (T.isSPIR() || (T.isSPIRV() && !T.isSPIRVLogical()))) && + if ((T.isSPIR() || (T.isSPIRV() && !T.isSPIRVLogical())) && !DL.contains("-G") && !DL.starts_with("G")) { return DL.empty() ? std::string("G1") : (DL + "-G1").str(); } @@ -6055,35 +6054,43 @@ std::string llvm::UpgradeDataLayoutString(StringRef DL, StringRef TT) { return DL.str(); } + // AMDGPU data layout upgrades. std::string Res = DL.str(); - // AMDGCN data layout upgrades. - if (T.isAMDGCN()) { + if (T.isAMDGPU()) { // Define address spaces for constants. if (!DL.contains("-G") && !DL.starts_with("G")) Res.append(Res.empty() ? "G1" : "-G1"); - // Add missing non-integral declarations. - // This goes before adding new address spaces to prevent incoherent string - // values. - if (!DL.contains("-ni") && !DL.starts_with("ni")) - Res.append("-ni:7:8:9"); - // Update ni:7 to ni:7:8:9. - if (DL.ends_with("ni:7")) - Res.append(":8:9"); - if (DL.ends_with("ni:7:8")) - Res.append(":9"); - - // Add sizing for address spaces 7 and 8 (fat raw buffers and buffer - // resources) An empty data layout has already been upgraded to G1 by now. - if (!DL.contains("-p7") && !DL.starts_with("p7")) - Res.append("-p7:160:256:256:32"); - if (!DL.contains("-p8") && !DL.starts_with("p8")) - Res.append("-p8:128:128:128:48"); - constexpr StringRef OldP8("-p8:128:128-"); - if (DL.contains(OldP8)) - Res.replace(Res.find(OldP8), OldP8.size(), "-p8:128:128:128:48-"); - if (!DL.contains("-p9") && !DL.starts_with("p9")) - Res.append("-p9:192:256:256:32"); + // AMDGCN data layout upgrades. + if (T.isAMDGCN()) { + + // Add missing non-integral declarations. + // This goes before adding new address spaces to prevent incoherent string + // values. + if (!DL.contains("-ni") && !DL.starts_with("ni")) + Res.append("-ni:7:8:9"); + // Update ni:7 to ni:7:8:9. + if (DL.ends_with("ni:7")) + Res.append(":8:9"); + if (DL.ends_with("ni:7:8")) + Res.append(":9"); + + // Add sizing for address spaces 7 and 8 (fat raw buffers and buffer + // resources) An empty data layout has already been upgraded to G1 by now. + if (!DL.contains("-p7") && !DL.starts_with("p7")) + Res.append("-p7:160:256:256:32"); + if (!DL.contains("-p8") && !DL.starts_with("p8")) + Res.append("-p8:128:128:128:48"); + constexpr StringRef OldP8("-p8:128:128-"); + if (DL.contains(OldP8)) + Res.replace(Res.find(OldP8), OldP8.size(), "-p8:128:128:128:48-"); + if (!DL.contains("-p9") && !DL.starts_with("p9")) + Res.append("-p9:192:256:256:32"); + } + + // Upgrade the ELF mangling mode. + if (!DL.contains("m:e")) + Res = Res.empty() ? "m:e" : "m:e-" + Res; return Res; } diff --git a/llvm/lib/IR/DebugInfo.cpp b/llvm/lib/IR/DebugInfo.cpp index 9601a8a..5883606 100644 --- a/llvm/lib/IR/DebugInfo.cpp +++ b/llvm/lib/IR/DebugInfo.cpp @@ -294,9 +294,9 @@ void DebugInfoFinder::processSubprogram(DISubprogram *SP) { // just DISubprogram's, referenced from anywhere within the Function being // cloned prior to calling MapMetadata / RemapInstruction to avoid their // duplication later as DICompileUnit's are also directly referenced by - // llvm.dbg.cu list. Thefore we need to collect DICompileUnit's here as well. - // Also, DICompileUnit's may reference DISubprogram's too and therefore need - // to be at least looked through. + // llvm.dbg.cu list. Therefore we need to collect DICompileUnit's here as + // well. Also, DICompileUnit's may reference DISubprogram's too and therefore + // need to be at least looked through. processCompileUnit(SP->getUnit()); processType(SP->getType()); for (auto *Element : SP->getTemplateParams()) { @@ -377,7 +377,7 @@ bool DebugInfoFinder::addScope(DIScope *Scope) { /// Recursively handle DILocations in followup metadata etc. /// -/// TODO: If for example a followup loop metadata would refence itself this +/// TODO: If for example a followup loop metadata would reference itself this /// function would go into infinite recursion. We do not expect such cycles in /// the loop metadata (except for the self-referencing first element /// "LoopID"). However, we could at least handle such situations more gracefully @@ -679,7 +679,7 @@ private: auto Variables = nullptr; auto TemplateParams = nullptr; - // Make a distinct DISubprogram, for situations that warrent it. + // Make a distinct DISubprogram, for situations that warrant it. auto distinctMDSubprogram = [&]() { return DISubprogram::getDistinct( MDS->getContext(), FileAndScope, MDS->getName(), LinkageName, @@ -1095,6 +1095,35 @@ LLVMDIBuilderCreateFile(LLVMDIBuilderRef Builder, const char *Filename, StringRef(Directory, DirectoryLen))); } +static llvm::DIFile::ChecksumKind +map_from_llvmChecksumKind(LLVMChecksumKind CSKind) { + switch (CSKind) { + case LLVMChecksumKind::CSK_MD5: + return llvm::DIFile::CSK_MD5; + case LLVMChecksumKind::CSK_SHA1: + return llvm::DIFile::CSK_SHA1; + case LLVMChecksumKind::CSK_SHA256: + return llvm::DIFile::CSK_SHA256; + } + llvm_unreachable("Unhandled Checksum Kind"); +} + +LLVMMetadataRef LLVMDIBuilderCreateFileWithChecksum( + LLVMDIBuilderRef Builder, const char *Filename, size_t FilenameLen, + const char *Directory, size_t DirectoryLen, LLVMChecksumKind ChecksumKind, + const char *Checksum, size_t ChecksumLen, const char *Source, + size_t SourceLen) { + StringRef ChkSum = StringRef(Checksum, ChecksumLen); + auto CSK = map_from_llvmChecksumKind(ChecksumKind); + llvm::DIFile::ChecksumInfo<StringRef> CSInfo(CSK, ChkSum); + std::optional<StringRef> Src; + if (SourceLen > 0) + Src = StringRef(Source, SourceLen); + return wrap(unwrap(Builder)->createFile(StringRef(Filename, FilenameLen), + StringRef(Directory, DirectoryLen), + CSInfo, Src)); +} + LLVMMetadataRef LLVMDIBuilderCreateModule(LLVMDIBuilderRef Builder, LLVMMetadataRef ParentScope, const char *Name, size_t NameLen, @@ -2014,7 +2043,7 @@ void at::remapAssignID(DenseMap<DIAssignID *, DIAssignID *> &Map, I.setMetadata(LLVMContext::MD_DIAssignID, GetNewID(ID)); } -/// Collect constant properies (base, size, offset) of \p StoreDest. +/// Collect constant properties (base, size, offset) of \p StoreDest. /// Return std::nullopt if any properties are not constants or the /// offset from the base pointer is negative. static std::optional<AssignmentInfo> @@ -2300,7 +2329,7 @@ PreservedAnalyses AssignmentTrackingPass::run(Function &F, return PreservedAnalyses::all(); // Record that this module uses assignment tracking. It doesn't matter that - // some functons in the module may not use it - the debug info in those + // some functions in the module may not use it - the debug info in those // functions will still be handled properly. setAssignmentTrackingModuleFlag(*F.getParent()); diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index c79a950..3572852 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -6479,9 +6479,12 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) { NumRows->getZExtValue() * NumColumns->getZExtValue(), "Result of a matrix operation does not fit in the returned vector!"); - if (Stride) + if (Stride) { + Check(Stride->getBitWidth() <= 64, "Stride bitwidth cannot exceed 64!", + IF); Check(Stride->getZExtValue() >= NumRows->getZExtValue(), "Stride must be greater or equal than the number of rows!", IF); + } break; } |