From 7160384d40ac5025c5ab23cd898b5370749c66a1 Mon Sep 17 00:00:00 2001 From: Scott Linder Date: Mon, 12 Feb 2018 19:45:54 +0000 Subject: [DebugInfo] Unify ChecksumKind and Checksum value in DIFile Rather than encode the absence of a checksum with a Kind variant, instead put both the kind and value in a struct and wrap it in an Optional. Differential Revision: http://reviews.llvm.org/D43043 llvm-svn: 324928 --- llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp | 21 ++++++++++++++------- llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp | 7 ++++--- 2 files changed, 18 insertions(+), 10 deletions(-) (limited to 'llvm/lib/CodeGen') diff --git a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp index 9e714e4c38d..05c00014f44 100644 --- a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp @@ -165,14 +165,21 @@ unsigned CodeViewDebug::maybeRecordFile(const DIFile *F) { auto Insertion = FileIdMap.insert(std::make_pair(FullPath, NextId)); if (Insertion.second) { // We have to compute the full filepath and emit a .cv_file directive. - std::string Checksum = fromHex(F->getChecksum()); - void *CKMem = OS.getContext().allocate(Checksum.size(), 1); - memcpy(CKMem, Checksum.data(), Checksum.size()); - ArrayRef ChecksumAsBytes(reinterpret_cast(CKMem), - Checksum.size()); - DIFile::ChecksumKind ChecksumKind = F->getChecksumKind(); + ArrayRef ChecksumAsBytes; + FileChecksumKind CSKind = FileChecksumKind::None; + if (F->getChecksum()) { + std::string Checksum = fromHex(F->getChecksum()->Value); + void *CKMem = OS.getContext().allocate(Checksum.size(), 1); + memcpy(CKMem, Checksum.data(), Checksum.size()); + ChecksumAsBytes = ArrayRef( + reinterpret_cast(CKMem), Checksum.size()); + switch (F->getChecksum()->Kind) { + case DIFile::CSK_MD5: CSKind = FileChecksumKind::MD5; break; + case DIFile::CSK_SHA1: CSKind = FileChecksumKind::SHA1; break; + } + } bool Success = OS.EmitCVFileDirective(NextId, FullPath, ChecksumAsBytes, - static_cast(ChecksumKind)); + static_cast(CSKind)); (void)Success; assert(Success && ".cv_file directive failed"); } diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp index 939d13faec0..f799453d47d 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp @@ -280,15 +280,16 @@ void DwarfUnit::addSectionOffset(DIE &Die, dwarf::Attribute Attribute, MD5::MD5Result *DwarfUnit::getMD5AsBytes(const DIFile *File) { assert(File); - if (File->getChecksumKind() != DIFile::CSK_MD5) + Optional> Checksum = File->getChecksum(); + if (!Checksum || Checksum->Kind != DIFile::CSK_MD5) return nullptr; // Convert the string checksum to an MD5Result for the streamer. // The verifier validates the checksum so we assume it's okay. // An MD5 checksum is 16 bytes. - std::string Checksum = fromHex(File->getChecksum()); + std::string ChecksumString = fromHex(Checksum->Value); void *CKMem = Asm->OutStreamer->getContext().allocate(16, 1); - memcpy(CKMem, Checksum.data(), 16); + memcpy(CKMem, ChecksumString.data(), 16); return reinterpret_cast(CKMem); } -- cgit v1.2.3