diff options
author | Amjad Aboud <amjad.aboud@intel.com> | 2016-12-25 10:12:09 +0000 |
---|---|---|
committer | Amjad Aboud <amjad.aboud@intel.com> | 2016-12-25 10:12:09 +0000 |
commit | 7faeecc8f78c31c24c32a9c2e468e840e1b0a15d (patch) | |
tree | 070d7be17f00e414ff58b6f2b3b8517d3d2341bb /llvm/lib | |
parent | 5dc0bba4e4a76a338dd34ef6eee695e8446e9236 (diff) | |
download | bcm5719-llvm-7faeecc8f78c31c24c32a9c2e468e840e1b0a15d.tar.gz bcm5719-llvm-7faeecc8f78c31c24c32a9c2e468e840e1b0a15d.zip |
[DebugInfo] Added support for Checksum debug info feature.
Differential Revision: https://reviews.llvm.org/D27642
llvm-svn: 290514
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/AsmParser/LLLexer.cpp | 6 | ||||
-rw-r--r-- | llvm/lib/AsmParser/LLParser.cpp | 30 | ||||
-rw-r--r-- | llvm/lib/AsmParser/LLToken.h | 1 | ||||
-rw-r--r-- | llvm/lib/Bitcode/Reader/MetadataLoader.cpp | 8 | ||||
-rw-r--r-- | llvm/lib/Bitcode/Writer/BitcodeWriter.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/IR/AsmWriter.cpp | 10 | ||||
-rw-r--r-- | llvm/lib/IR/DIBuilder.cpp | 5 | ||||
-rw-r--r-- | llvm/lib/IR/DebugInfoMetadata.cpp | 28 | ||||
-rw-r--r-- | llvm/lib/IR/LLVMContextImpl.h | 19 | ||||
-rw-r--r-- | llvm/lib/IR/Verifier.cpp | 2 |
10 files changed, 95 insertions, 16 deletions
diff --git a/llvm/lib/AsmParser/LLLexer.cpp b/llvm/lib/AsmParser/LLLexer.cpp index bed5306cc07..752942fc9fc 100644 --- a/llvm/lib/AsmParser/LLLexer.cpp +++ b/llvm/lib/AsmParser/LLLexer.cpp @@ -808,6 +808,12 @@ lltok::Kind LLLexer::LexIdentifier() { StrVal.assign(Keyword.begin(), Keyword.end()); return lltok::DIFlag; } + + if (Keyword.startswith("CSK_")) { + StrVal.assign(Keyword.begin(), Keyword.end()); + return lltok::ChecksumKind; + } + if (Keyword == "NoDebug" || Keyword == "FullDebug" || Keyword == "LineTablesOnly") { StrVal.assign(Keyword.begin(), Keyword.end()); diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp index d2e2c0d46d3..8e86b483664 100644 --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -3465,6 +3465,11 @@ struct MDFieldList : public MDFieldImpl<SmallVector<Metadata *, 4>> { MDFieldList() : ImplTy(SmallVector<Metadata *, 4>()) {} }; +struct ChecksumKindField : public MDFieldImpl<DIFile::ChecksumKind> { + ChecksumKindField() : ImplTy(DIFile::CSK_None) {} + ChecksumKindField(DIFile::ChecksumKind CSKind) : ImplTy(CSKind) {} +}; + } // end anonymous namespace namespace llvm { @@ -3742,6 +3747,20 @@ bool LLParser::ParseMDField(LocTy Loc, StringRef Name, MDFieldList &Result) { return false; } +template <> +bool LLParser::ParseMDField(LocTy Loc, StringRef Name, + ChecksumKindField &Result) { + if (Lex.getKind() != lltok::ChecksumKind) + return TokError( + "invalid checksum kind" + Twine(" '") + Lex.getStrVal() + "'"); + + DIFile::ChecksumKind CSKind = DIFile::getChecksumKind(Lex.getStrVal()); + + Result.assign(CSKind); + Lex.Lex(); + return false; +} + } // end namespace llvm template <class ParserTy> @@ -3971,15 +3990,20 @@ bool LLParser::ParseDISubroutineType(MDNode *&Result, bool IsDistinct) { } /// ParseDIFileType: -/// ::= !DIFileType(filename: "path/to/file", directory: "/path/to/dir") +/// ::= !DIFileType(filename: "path/to/file", directory: "/path/to/dir" +/// checksumkind: CSK_MD5, +/// checksum: "000102030405060708090a0b0c0d0e0f") bool LLParser::ParseDIFile(MDNode *&Result, bool IsDistinct) { #define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \ REQUIRED(filename, MDStringField, ); \ - REQUIRED(directory, MDStringField, ); + REQUIRED(directory, MDStringField, ); \ + OPTIONAL(checksumkind, ChecksumKindField, ); \ + OPTIONAL(checksum, MDStringField, ); PARSE_MD_FIELDS(); #undef VISIT_MD_FIELDS - Result = GET_OR_DISTINCT(DIFile, (Context, filename.Val, directory.Val)); + Result = GET_OR_DISTINCT(DIFile, (Context, filename.Val, directory.Val, + checksumkind.Val, checksum.Val)); return false; } diff --git a/llvm/lib/AsmParser/LLToken.h b/llvm/lib/AsmParser/LLToken.h index a1695258bbe..048aeee90b3 100644 --- a/llvm/lib/AsmParser/LLToken.h +++ b/llvm/lib/AsmParser/LLToken.h @@ -353,6 +353,7 @@ enum Kind { DwarfOp, // DW_OP_foo DIFlag, // DIFlagFoo DwarfMacinfo, // DW_MACINFO_foo + ChecksumKind, // CSK_foo // Type valued tokens (TyVal). Type, diff --git a/llvm/lib/Bitcode/Reader/MetadataLoader.cpp b/llvm/lib/Bitcode/Reader/MetadataLoader.cpp index 595b9837c1d..cd08268d47b 100644 --- a/llvm/lib/Bitcode/Reader/MetadataLoader.cpp +++ b/llvm/lib/Bitcode/Reader/MetadataLoader.cpp @@ -815,13 +815,17 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( } case bitc::METADATA_FILE: { - if (Record.size() != 3) + if (Record.size() != 3 && Record.size() != 5) return error("Invalid record"); IsDistinct = Record[0]; MetadataList.assignValue( GET_OR_DISTINCT( - DIFile, (Context, getMDString(Record[1]), getMDString(Record[2]))), + DIFile, + (Context, getMDString(Record[1]), getMDString(Record[2]), + Record.size() == 3 ? DIFile::CSK_None + : static_cast<DIFile::ChecksumKind>(Record[3]), + Record.size() == 3 ? nullptr : getMDString(Record[4]))), NextMetadataNo++); break; } diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp index d2abf7cb39a..9d2bea8ccae 100644 --- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -1515,6 +1515,8 @@ void ModuleBitcodeWriter::writeDIFile(const DIFile *N, Record.push_back(N->isDistinct()); Record.push_back(VE.getMetadataOrNullID(N->getRawFilename())); Record.push_back(VE.getMetadataOrNullID(N->getRawDirectory())); + Record.push_back(N->getChecksumKind()); + Record.push_back(VE.getMetadataOrNullID(N->getRawChecksum())); Stream.EmitRecord(bitc::METADATA_FILE, Record, Abbrev); Record.clear(); diff --git a/llvm/lib/IR/AsmWriter.cpp b/llvm/lib/IR/AsmWriter.cpp index 83edaaddc84..eecef9423f2 100644 --- a/llvm/lib/IR/AsmWriter.cpp +++ b/llvm/lib/IR/AsmWriter.cpp @@ -1408,6 +1408,7 @@ struct MDFieldPrinter { } void printTag(const DINode *N); void printMacinfoType(const DIMacroNode *N); + void printChecksumKind(const DIFile *N); void printString(StringRef Name, StringRef Value, bool ShouldSkipEmpty = true); void printMetadata(StringRef Name, const Metadata *MD, @@ -1441,6 +1442,13 @@ void MDFieldPrinter::printMacinfoType(const DIMacroNode *N) { Out << N->getMacinfoType(); } +void MDFieldPrinter::printChecksumKind(const DIFile *N) { + if (N->getChecksumKind() == DIFile::CSK_None) + // Skip CSK_None checksum kind. + return; + Out << FS << "checksumkind: " << N->getChecksumKindAsString(); +} + void MDFieldPrinter::printString(StringRef Name, StringRef Value, bool ShouldSkipEmpty) { if (ShouldSkipEmpty && Value.empty()) @@ -1653,6 +1661,8 @@ static void writeDIFile(raw_ostream &Out, const DIFile *N, TypePrinting *, /* ShouldSkipEmpty */ false); Printer.printString("directory", N->getDirectory(), /* ShouldSkipEmpty */ false); + Printer.printChecksumKind(N); + Printer.printString("checksum", N->getChecksum(), /* ShouldSkipEmpty */ true); Out << ")"; } diff --git a/llvm/lib/IR/DIBuilder.cpp b/llvm/lib/IR/DIBuilder.cpp index d009322a572..2ea572490b6 100644 --- a/llvm/lib/IR/DIBuilder.cpp +++ b/llvm/lib/IR/DIBuilder.cpp @@ -174,8 +174,9 @@ DIImportedEntity *DIBuilder::createImportedDeclaration(DIScope *Context, Context, Decl, Line, Name, AllImportedModules); } -DIFile *DIBuilder::createFile(StringRef Filename, StringRef Directory) { - return DIFile::get(VMContext, Filename, Directory); +DIFile *DIBuilder::createFile(StringRef Filename, StringRef Directory, + DIFile::ChecksumKind CSKind, StringRef Checksum) { + return DIFile::get(VMContext, Filename, Directory, CSKind, Checksum); } DIEnumerator *DIBuilder::createEnumerator(StringRef Name, int64_t Val) { diff --git a/llvm/lib/IR/DebugInfoMetadata.cpp b/llvm/lib/IR/DebugInfoMetadata.cpp index 1003093760f..8e21a907e15 100644 --- a/llvm/lib/IR/DebugInfoMetadata.cpp +++ b/llvm/lib/IR/DebugInfoMetadata.cpp @@ -347,14 +347,34 @@ DISubroutineType *DISubroutineType::getImpl(LLVMContext &Context, DIFlags Flags, DEFINE_GETIMPL_STORE(DISubroutineType, (Flags, CC), Ops); } +static const char *ChecksumKindName[DIFile::CSK_Last + 1] = { + "CSK_None", + "CSK_MD5", + "CSK_SHA1" +}; + +DIFile::ChecksumKind DIFile::getChecksumKind(StringRef CSKindStr) { + return StringSwitch<DIFile::ChecksumKind>(CSKindStr) + .Case("CSK_MD5", DIFile::CSK_MD5) + .Case("CSK_SHA1", DIFile::CSK_SHA1) + .Default(DIFile::CSK_None); +} + +StringRef DIFile::getChecksumKindAsString() const { + assert(CSKind <= DIFile::CSK_Last && "Invalid checksum kind"); + return ChecksumKindName[CSKind]; +} + DIFile *DIFile::getImpl(LLVMContext &Context, MDString *Filename, - MDString *Directory, StorageType Storage, + MDString *Directory, DIFile::ChecksumKind CSKind, + MDString *Checksum, StorageType Storage, bool ShouldCreate) { assert(isCanonical(Filename) && "Expected canonical MDString"); assert(isCanonical(Directory) && "Expected canonical MDString"); - DEFINE_GETIMPL_LOOKUP(DIFile, (Filename, Directory)); - Metadata *Ops[] = {Filename, Directory}; - DEFINE_GETIMPL_STORE_NO_CONSTRUCTOR_ARGS(DIFile, Ops); + assert(isCanonical(Checksum) && "Expected canonical MDString"); + DEFINE_GETIMPL_LOOKUP(DIFile, (Filename, Directory, CSKind, Checksum)); + Metadata *Ops[] = {Filename, Directory, Checksum}; + DEFINE_GETIMPL_STORE(DIFile, (CSKind), Ops); } DICompileUnit *DICompileUnit::getImpl( diff --git a/llvm/lib/IR/LLVMContextImpl.h b/llvm/lib/IR/LLVMContextImpl.h index 55443c598f9..e9e30ef0656 100644 --- a/llvm/lib/IR/LLVMContextImpl.h +++ b/llvm/lib/IR/LLVMContextImpl.h @@ -503,17 +503,26 @@ template <> struct MDNodeKeyImpl<DISubroutineType> { template <> struct MDNodeKeyImpl<DIFile> { MDString *Filename; MDString *Directory; + DIFile::ChecksumKind CSKind; + MDString *Checksum; - MDNodeKeyImpl(MDString *Filename, MDString *Directory) - : Filename(Filename), Directory(Directory) {} + MDNodeKeyImpl(MDString *Filename, MDString *Directory, + DIFile::ChecksumKind CSKind, MDString *Checksum) + : Filename(Filename), Directory(Directory), CSKind(CSKind), + Checksum(Checksum) {} MDNodeKeyImpl(const DIFile *N) - : Filename(N->getRawFilename()), Directory(N->getRawDirectory()) {} + : Filename(N->getRawFilename()), Directory(N->getRawDirectory()), + CSKind(N->getChecksumKind()), Checksum(N->getRawChecksum()) {} bool isKeyOf(const DIFile *RHS) const { return Filename == RHS->getRawFilename() && - Directory == RHS->getRawDirectory(); + Directory == RHS->getRawDirectory() && + CSKind == RHS->getChecksumKind() && + Checksum == RHS->getRawChecksum(); + } + unsigned getHashValue() const { + return hash_combine(Filename, Directory, CSKind, Checksum); } - unsigned getHashValue() const { return hash_combine(Filename, Directory); } }; template <> struct MDNodeKeyImpl<DISubprogram> { diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index 9a19354e255..dc7f7bf9080 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -961,6 +961,8 @@ void Verifier::visitDISubroutineType(const DISubroutineType &N) { void Verifier::visitDIFile(const DIFile &N) { AssertDI(N.getTag() == dwarf::DW_TAG_file_type, "invalid tag", &N); + AssertDI((N.getChecksumKind() != DIFile::CSK_None || + N.getChecksum().empty()), "invalid checksum kind", &N); } void Verifier::visitDICompileUnit(const DICompileUnit &N) { |