]> granicus.if.org Git - llvm/commitdiff
Revert "Fix Bug 30978 by emitting cv file checksums."
authorEric Beckmann <ecbeckmann@google.com>
Sat, 16 Sep 2017 01:14:36 +0000 (01:14 +0000)
committerEric Beckmann <ecbeckmann@google.com>
Sat, 16 Sep 2017 01:14:36 +0000 (01:14 +0000)
This reverts commit 6389e7aa724ea7671d096f4770f016c3d86b0d54.

There is a bug in this implementation where the string value of the
checksum is outputted, instead of the actual hex bytes.  Therefore the
checksum is incorrect, and this prevent pdbs from being loaded by visual
studio.  Revert this until the checksum is emitted correctly.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@313431 91177308-0d34-0410-b5e6-96231b3b80d8

16 files changed:
include/llvm/IR/DebugInfoMetadata.h
include/llvm/MC/MCCodeView.h
include/llvm/MC/MCObjectStreamer.h
include/llvm/MC/MCStreamer.h
lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
lib/IR/DebugInfoMetadata.cpp
lib/MC/MCAsmStreamer.cpp
lib/MC/MCCodeView.cpp
lib/MC/MCObjectStreamer.cpp
lib/MC/MCParser/AsmParser.cpp
lib/MC/MCStreamer.cpp
test/DebugInfo/COFF/inlining.ll
test/DebugInfo/COFF/multifile.ll
test/DebugInfo/COFF/simple.ll
test/MC/AArch64/coff-debug.ll
unittests/IR/MetadataTest.cpp

index e18395781e98dde5c46310b32217a75a71ab0f79..f6c11ce00d1d84f7d8f81eb554ad1f74e4943ea5 100644 (file)
@@ -473,12 +473,10 @@ class DIFile : public DIScope {
   friend class MDNode;
 
 public:
-  // These values must be explictly set, as they end up in the final object
-  // file.
   enum ChecksumKind {
-    CSK_None = 0,
-    CSK_MD5 = 1,
-    CSK_SHA1 = 2,
+    CSK_None,
+    CSK_MD5,
+    CSK_SHA1,
     CSK_Last = CSK_SHA1 // Should be last enumeration.
   };
 
@@ -512,7 +510,7 @@ public:
                              ChecksumKind CSK = CSK_None,
                              StringRef CS = StringRef()),
                     (Filename, Directory, CSK, CS))
-  DEFINE_MDNODE_GET(DIFile, (MDString * Filename, MDString *Directory,
+  DEFINE_MDNODE_GET(DIFile, (MDString *Filename, MDString *Directory,
                              ChecksumKind CSK = CSK_None,
                              MDString *CS = nullptr),
                     (Filename, Directory, CSK, CS))
index 4f290ea4e34accbcf54e0b5667de73dfb2dccff9..c3f1cecc97f48753577ca6911c31b700726c347a 100644 (file)
@@ -161,8 +161,8 @@ public:
   ~CodeViewContext();
 
   bool isValidFileNumber(unsigned FileNumber) const;
-  bool addFile(MCStreamer &OS, unsigned FileNumber, StringRef Filename,
-               StringRef Checksum, uint8_t ChecksumKind);
+  bool addFile(unsigned FileNumber, StringRef Filename);
+  ArrayRef<StringRef> getFilenames() { return Filenames; }
 
   /// Records the function id of a normal function. Returns false if the
   /// function id has already been used, and true otherwise.
@@ -273,9 +273,6 @@ public:
   /// Emits the file checksum substream.
   void emitFileChecksums(MCObjectStreamer &OS);
 
-  /// Emits the offset into the checksum table of the given file number.
-  void emitFileChecksumOffset(MCObjectStreamer &OS, unsigned FileNo);
-
 private:
   /// The current CodeView line information from the last .cv_loc directive.
   MCCVLoc CurrentCVLoc = MCCVLoc(0, 0, 0, 0, false, true);
@@ -290,30 +287,14 @@ private:
 
   MCDataFragment *getStringTableFragment();
 
-  /// Add something to the string table.  Returns the final string as well as
-  /// offset into the string table.
-  std::pair<StringRef, unsigned> addToStringTable(StringRef S);
+  /// Add something to the string table.
+  StringRef addToStringTable(StringRef S);
 
   /// Get a string table offset.
   unsigned getStringTableOffset(StringRef S);
 
-  struct FileInfo {
-    unsigned StringTableOffset;
-
-    // Checksum offset stored as a symbol because it might be requested
-    // before it has been calculated, so a fixup may be needed.
-    MCSymbol *ChecksumTableOffset;
-
-    // Indicates if this FileInfo corresponds to an actual file, or hasn't been
-    // set yet.
-    bool Assigned = false;
-
-    std::string Checksum;
-    uint8_t ChecksumKind;
-  };
-
-  /// Array storing added file information.
-  SmallVector<FileInfo, 4> Files;
+  /// An array of absolute paths. Eventually this may include the file checksum.
+  SmallVector<StringRef, 4> Filenames;
 
   /// The offset of the first and last .cv_loc directive for a given function
   /// id.
@@ -324,10 +305,6 @@ private:
 
   /// All known functions and inlined call sites, indexed by function id.
   std::vector<MCCVFunctionInfo> Functions;
-
-  /// Indicate whether we have already laid out the checksum table addresses or
-  /// not.
-  bool ChecksumOffsetsAssigned = false;
 };
 
 } // end namespace llvm
index 284af06e1a58b9377e3cda52c1f28770a0c6b3ff..7c1189e46ab237aec24f8898d0c5cf9d6414d7be 100644 (file)
@@ -140,7 +140,6 @@ public:
       StringRef FixedSizePortion) override;
   void EmitCVStringTableDirective() override;
   void EmitCVFileChecksumsDirective() override;
-  void EmitCVFileChecksumOffsetDirective(unsigned FileNo) override;
   void EmitDTPRel32Value(const MCExpr *Value) override;
   void EmitDTPRel64Value(const MCExpr *Value) override;
   void EmitTPRel32Value(const MCExpr *Value) override;
index a251616d2cd300333384de2f9678c99b33d844fd..e6061a6d9251c2fe70662c27e8e26fedae2aa942 100644 (file)
@@ -733,11 +733,10 @@ public:
                                      unsigned Isa, unsigned Discriminator,
                                      StringRef FileName);
 
-  /// Associate a filename with a specified logical file number, and also
-  /// specify that file's checksum information.  This implements the '.cv_file 4
-  /// "foo.c"' assembler directive. Returns true on success.
-  virtual bool EmitCVFileDirective(unsigned FileNo, StringRef Filename,
-                                   StringRef Checksum, unsigned ChecksumKind);
+  /// \brief Associate a filename with a specified logical file number.  This
+  /// implements the '.cv_file 4 "foo.c"' assembler directive. Returns true on
+  /// success.
+  virtual bool EmitCVFileDirective(unsigned FileNo, StringRef Filename);
 
   /// \brief Introduces a function id for use with .cv_loc.
   virtual bool EmitCVFuncIdDirective(unsigned FunctionId);
@@ -779,10 +778,6 @@ public:
   /// \brief This implements the CodeView '.cv_filechecksums' assembler directive.
   virtual void EmitCVFileChecksumsDirective() {}
 
-  /// This implements the CodeView '.cv_filechecksumoffset' assembler
-  /// directive.
-  virtual void EmitCVFileChecksumOffsetDirective(unsigned FileNo) {}
-
   /// Emit the absolute difference between two symbols.
   ///
   /// \pre Offset of \c Hi is greater than the offset \c Lo.
index db72269983f1d06060b2f1bd87b1a7aa5cf17301..87aeb1f03dda731112677262de7d60b9e13295b4 100644 (file)
@@ -159,10 +159,7 @@ unsigned CodeViewDebug::maybeRecordFile(const DIFile *F) {
   if (Insertion.second) {
     // We have to compute the full filepath and emit a .cv_file directive.
     StringRef FullPath = getFullFilepath(F);
-    StringRef Checksum = F->getChecksum();
-    DIFile::ChecksumKind ChecksumKind = F->getChecksumKind();
-    bool Success = OS.EmitCVFileDirective(NextId, FullPath, Checksum,
-                                          static_cast<unsigned>(ChecksumKind));
+    bool Success = OS.EmitCVFileDirective(NextId, FullPath);
     (void)Success;
     assert(Success && ".cv_file directive failed");
   }
@@ -684,10 +681,8 @@ void CodeViewDebug::emitInlineeLinesSubsection() {
   OS.AddComment("Inlinee lines subsection");
   MCSymbol *InlineEnd = beginCVSubsection(DebugSubsectionKind::InlineeLines);
 
-  // We emit the checksum info for files.  This is used by debuggers to
-  // determine if a pdb matches the source before loading it.  Visual Studio,
-  // for instance, will display a warning that the breakpoints are not valid if
-  // the pdb does not match the source.
+  // We don't provide any extra file info.
+  // FIXME: Find out if debuggers use this info.
   OS.AddComment("Inlinee lines signature");
   OS.EmitIntValue(unsigned(InlineeLinesSignature::Normal), 4);
 
@@ -700,10 +695,13 @@ void CodeViewDebug::emitInlineeLinesSubsection() {
     OS.AddComment("Inlined function " + SP->getName() + " starts at " +
                   SP->getFilename() + Twine(':') + Twine(SP->getLine()));
     OS.AddBlankLine();
+    // The filechecksum table uses 8 byte entries for now, and file ids start at
+    // 1.
+    unsigned FileOffset = (FileId - 1) * 8;
     OS.AddComment("Type index of inlined function");
     OS.EmitIntValue(InlineeIdx.getIndex(), 4);
     OS.AddComment("Offset into filechecksum table");
-    OS.EmitCVFileChecksumOffsetDirective(FileId);
+    OS.EmitIntValue(FileOffset, 4);
     OS.AddComment("Starting line number");
     OS.EmitIntValue(SP->getLine(), 4);
   }
index 1ef43e60b54340eac5301bb164313b57223fcd8d..9ef8c35dbd030c02f370e3047494788463560839 100644 (file)
@@ -354,8 +354,6 @@ DISubroutineType *DISubroutineType::getImpl(LLVMContext &Context, DIFlags Flags,
   DEFINE_GETIMPL_STORE(DISubroutineType, (Flags, CC), Ops);
 }
 
-// FIXME: Implement this string-enum correspondence with a .def file and macros,
-// so that the association is explicit rather than implied.
 static const char *ChecksumKindName[DIFile::CSK_Last + 1] = {
   "CSK_None",
   "CSK_MD5",
index 69f4a5d0147d78bfd7a4343b976bded304f1cf72..934a6c3348480f6eb2c08e9c02fb20e97e2082d7 100644 (file)
@@ -225,8 +225,7 @@ public:
                              StringRef FileName) override;
   MCSymbol *getDwarfLineTableSymbol(unsigned CUID) override;
 
-  bool EmitCVFileDirective(unsigned FileNo, StringRef Filename,
-                           StringRef Checksum, unsigned ChecksumKind) override;
+  bool EmitCVFileDirective(unsigned FileNo, StringRef Filename) override;
   bool EmitCVFuncIdDirective(unsigned FuncId) override;
   bool EmitCVInlineSiteIdDirective(unsigned FunctionId, unsigned IAFunc,
                                    unsigned IAFile, unsigned IALine,
@@ -246,7 +245,6 @@ public:
       StringRef FixedSizePortion) override;
   void EmitCVStringTableDirective() override;
   void EmitCVFileChecksumsDirective() override;
-  void EmitCVFileChecksumOffsetDirective(unsigned FileNo) override;
 
   void EmitIdent(StringRef IdentString) override;
   void EmitCFISections(bool EH, bool Debug) override;
@@ -1122,25 +1120,13 @@ MCSymbol *MCAsmStreamer::getDwarfLineTableSymbol(unsigned CUID) {
   return MCStreamer::getDwarfLineTableSymbol(0);
 }
 
-bool MCAsmStreamer::EmitCVFileDirective(unsigned FileNo, StringRef Filename,
-                                        StringRef Checksum,
-                                        unsigned ChecksumKind) {
-  if (!getContext().getCVContext().addFile(*this, FileNo, Filename, Checksum,
-                                           ChecksumKind))
+bool MCAsmStreamer::EmitCVFileDirective(unsigned FileNo, StringRef Filename) {
+  if (!getContext().getCVContext().addFile(FileNo, Filename))
     return false;
 
   OS << "\t.cv_file\t" << FileNo << ' ';
-  PrintQuotedString(Filename, OS);
-
-  if (!ChecksumKind) {
-    EmitEOL();
-    return true;
-  }
-
-  OS << ' ';
-  PrintQuotedString(Checksum, OS);
-  OS << ' ' << ChecksumKind;
 
+  PrintQuotedString(Filename, OS);
   EmitEOL();
   return true;
 }
@@ -1242,11 +1228,6 @@ void MCAsmStreamer::EmitCVFileChecksumsDirective() {
   EmitEOL();
 }
 
-void MCAsmStreamer::EmitCVFileChecksumOffsetDirective(unsigned FileNo) {
-  OS << "\t.cv_filechecksumoffset\t" << FileNo;
-  EmitEOL();
-}
-
 void MCAsmStreamer::EmitIdent(StringRef IdentString) {
   assert(MAI->hasIdentDirective() && ".ident directive not supported");
   OS << "\t.ident\t";
index ad6d9e5a5d8c40feacb75dedae19fff337122a61..92b1e12da5525e0e497a972fc7df718830d0e89f 100644 (file)
@@ -39,39 +39,29 @@ CodeViewContext::~CodeViewContext() {
 /// for it.
 bool CodeViewContext::isValidFileNumber(unsigned FileNumber) const {
   unsigned Idx = FileNumber - 1;
-  if (Idx < Files.size())
-    return Files[Idx].Assigned;
+  if (Idx < Filenames.size())
+    return !Filenames[Idx].empty();
   return false;
 }
 
-bool CodeViewContext::addFile(MCStreamer &OS, unsigned FileNumber,
-                              StringRef Filename, StringRef Checksum,
-                              uint8_t ChecksumKind) {
+bool CodeViewContext::addFile(unsigned FileNumber, StringRef Filename) {
   assert(FileNumber > 0);
-  auto FilenameOffset = addToStringTable(Filename);
-  Filename = FilenameOffset.first;
+  Filename = addToStringTable(Filename);
   unsigned Idx = FileNumber - 1;
-  if (Idx >= Files.size())
-    Files.resize(Idx + 1);
+  if (Idx >= Filenames.size())
+    Filenames.resize(Idx + 1);
 
   if (Filename.empty())
     Filename = "<stdin>";
 
-  if (Files[Idx].Assigned)
+  if (!Filenames[Idx].empty())
     return false;
 
-  FilenameOffset = addToStringTable(Filename);
-  Filename = FilenameOffset.first;
-  unsigned Offset = FilenameOffset.second;
-
-  auto ChecksumOffsetSymbol =
-      OS.getContext().createTempSymbol("checksum_offset", false);
-  Files[Idx].StringTableOffset = Offset;
-  Files[Idx].ChecksumTableOffset = ChecksumOffsetSymbol;
-  Files[Idx].Assigned = true;
-  Files[Idx].Checksum = Checksum.str();
-  Files[Idx].ChecksumKind = ChecksumKind;
+  // FIXME: We should store the string table offset of the filename, rather than
+  // the filename itself for efficiency.
+  Filename = addToStringTable(Filename);
 
+  Filenames[Idx] = Filename;
   return true;
 }
 
@@ -128,18 +118,17 @@ MCDataFragment *CodeViewContext::getStringTableFragment() {
   return StrTabFragment;
 }
 
-std::pair<StringRef, unsigned> CodeViewContext::addToStringTable(StringRef S) {
+StringRef CodeViewContext::addToStringTable(StringRef S) {
   SmallVectorImpl<char> &Contents = getStringTableFragment()->getContents();
   auto Insertion =
       StringTable.insert(std::make_pair(S, unsigned(Contents.size())));
   // Return the string from the table, since it is stable.
-  std::pair<StringRef, unsigned> Ret =
-      std::make_pair(Insertion.first->first(), Insertion.first->second);
+  S = Insertion.first->first();
   if (Insertion.second) {
     // The string map key is always null terminated.
-    Contents.append(Ret.first.begin(), Ret.first.end() + 1);
+    Contents.append(S.begin(), S.end() + 1);
   }
-  return Ret;
+  return S;
 }
 
 unsigned CodeViewContext::getStringTableOffset(StringRef S) {
@@ -176,7 +165,7 @@ void CodeViewContext::emitStringTable(MCObjectStreamer &OS) {
 void CodeViewContext::emitFileChecksums(MCObjectStreamer &OS) {
   // Do nothing if there are no file checksums. Microsoft's linker rejects empty
   // CodeView substreams.
-  if (Files.empty())
+  if (Filenames.empty())
     return;
 
   MCContext &Ctx = OS.getContext();
@@ -187,63 +176,17 @@ void CodeViewContext::emitFileChecksums(MCObjectStreamer &OS) {
   OS.emitAbsoluteSymbolDiff(FileEnd, FileBegin, 4);
   OS.EmitLabel(FileBegin);
 
-  unsigned CurrentOffset = 0;
-
   // Emit an array of FileChecksum entries. We index into this table using the
-  // user-provided file number.  Each entry may be a variable number of bytes
-  // determined by the checksum kind and size.
-  for (auto File : Files) {
-    OS.EmitAssignment(File.ChecksumTableOffset,
-                      MCConstantExpr::create(CurrentOffset, Ctx));
-    CurrentOffset += 4; // String table offset.
-    if (!File.ChecksumKind) {
-      CurrentOffset +=
-          4; // One byte each for checksum size and kind, then align to 4 bytes.
-    } else {
-      CurrentOffset += 2; // One byte each for checksum size and kind.
-      CurrentOffset += File.Checksum.size();
-      CurrentOffset = alignTo(CurrentOffset, 4);
-    }
-
-    OS.EmitIntValue(File.StringTableOffset, 4);
-
-    if (!File.ChecksumKind) {
-      // There is no checksum.  Therefore zero the next two fields and align
-      // back to 4 bytes.
-      OS.EmitIntValue(0, 4);
-      continue;
-    }
-    OS.EmitIntValue(static_cast<uint8_t>(File.Checksum.size()), 1);
-    OS.EmitIntValue(File.ChecksumKind, 1);
-    OS.EmitBytes(File.Checksum);
-    OS.EmitValueToAlignment(4);
+  // user-provided file number. Each entry is currently 8 bytes, as we don't
+  // emit checksums.
+  for (StringRef Filename : Filenames) {
+    OS.EmitIntValue(getStringTableOffset(Filename), 4);
+    // Zero the next two fields and align back to 4 bytes. This indicates that
+    // no checksum is present.
+    OS.EmitIntValue(0, 4);
   }
 
   OS.EmitLabel(FileEnd);
-
-  ChecksumOffsetsAssigned = true;
-}
-
-// Output checksum table offset of the given file number.  It is possible that
-// not all files have been registered yet, and so the offset cannot be
-// calculated.  In this case a symbol representing the offset is emitted, and
-// the value of this symbol will be fixed up at a later time.
-void CodeViewContext::emitFileChecksumOffset(MCObjectStreamer &OS,
-                                             unsigned FileNo) {
-  unsigned Idx = FileNo - 1;
-
-  if (Idx >= Files.size())
-    Files.resize(Idx + 1);
-
-  if (ChecksumOffsetsAssigned) {
-    OS.EmitSymbolValue(Files[Idx].ChecksumTableOffset, 4);
-    return;
-  }
-
-  const MCSymbolRefExpr *SRE =
-      MCSymbolRefExpr::create(Files[Idx].ChecksumTableOffset, OS.getContext());
-
-  OS.EmitValueImpl(SRE, 4);
 }
 
 void CodeViewContext::emitLineTableForFunction(MCObjectStreamer &OS,
@@ -276,12 +219,9 @@ void CodeViewContext::emitLineTableForFunction(MCObjectStreamer &OS,
           return Loc.getFileNum() != CurFileNum;
         });
     unsigned EntryCount = FileSegEnd - I;
-    OS.AddComment(
-        "Segment for file '" +
-        Twine(getStringTableFragment()
-                  ->getContents()[Files[CurFileNum - 1].StringTableOffset]) +
-        "' begins");
-    OS.EmitCVFileChecksumOffsetDirective(CurFileNum);
+    OS.AddComment("Segment for file '" + Twine(Filenames[CurFileNum - 1]) +
+                  "' begins");
+    OS.EmitIntValue(8 * (CurFileNum - 1), 4);
     OS.EmitIntValue(EntryCount, 4);
     uint32_t SegmentSize = 12;
     SegmentSize += 8 * EntryCount;
@@ -461,10 +401,9 @@ void CodeViewContext::encodeInlineLineTable(MCAsmLayout &Layout,
     HaveOpenRange = true;
 
     if (CurSourceLoc.File != LastSourceLoc.File) {
-      unsigned FileOffset = static_cast<const MCConstantExpr *>(
-                                Files[CurSourceLoc.File - 1]
-                                    .ChecksumTableOffset->getVariableValue())
-                                ->getValue();
+      // File ids are 1 based, and each file checksum table entry is 8 bytes
+      // long. See emitFileChecksums above.
+      unsigned FileOffset = 8 * (CurSourceLoc.File - 1);
       compressAnnotation(BinaryAnnotationsOpCode::ChangeFile, Buffer);
       compressAnnotation(FileOffset, Buffer);
     }
index e9e3133582c063ca040a847f645743e7847b1487..174397e273960066b428250e0eecdc9f85c7f41a 100644 (file)
@@ -426,9 +426,6 @@ void MCObjectStreamer::EmitCVFileChecksumsDirective() {
   getContext().getCVContext().emitFileChecksums(*this);
 }
 
-void MCObjectStreamer::EmitCVFileChecksumOffsetDirective(unsigned FileNo) {
-  getContext().getCVContext().emitFileChecksumOffset(*this, FileNo);
-}
 
 void MCObjectStreamer::EmitBytes(StringRef Data) {
   MCCVLineEntry::Make(this);
index 6e4f8e26b536a7b1fb29736c81d62d61c6c8d30d..ee3cc8d80a6d5dc6e133be08cc738a4a8e903997 100644 (file)
@@ -501,7 +501,6 @@ private:
     DK_CV_DEF_RANGE,
     DK_CV_STRINGTABLE,
     DK_CV_FILECHECKSUMS,
-    DK_CV_FILECHECKSUM_OFFSET,
     DK_CFI_SECTIONS,
     DK_CFI_STARTPROC,
     DK_CFI_ENDPROC,
@@ -577,7 +576,6 @@ private:
   bool parseDirectiveCVDefRange();
   bool parseDirectiveCVStringTable();
   bool parseDirectiveCVFileChecksums();
-  bool parseDirectiveCVFileChecksumOffset();
 
   // .cfi directives
   bool parseDirectiveCFIRegister(SMLoc DirectiveLoc);
@@ -2032,8 +2030,6 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info,
       return parseDirectiveCVStringTable();
     case DK_CV_FILECHECKSUMS:
       return parseDirectiveCVFileChecksums();
-    case DK_CV_FILECHECKSUM_OFFSET:
-      return parseDirectiveCVFileChecksumOffset();
     case DK_CFI_SECTIONS:
       return parseDirectiveCFISections();
     case DK_CFI_STARTPROC:
@@ -3461,34 +3457,25 @@ bool AsmParser::parseDirectiveStabs() {
 }
 
 /// parseDirectiveCVFile
-/// ::= .cv_file number filename [checksum] [checksumkind]
+/// ::= .cv_file number filename
 bool AsmParser::parseDirectiveCVFile() {
   SMLoc FileNumberLoc = getTok().getLoc();
   int64_t FileNumber;
   std::string Filename;
-  std::string Checksum;
-  int64_t ChecksumKind = 0;
 
   if (parseIntToken(FileNumber,
                     "expected file number in '.cv_file' directive") ||
       check(FileNumber < 1, FileNumberLoc, "file number less than one") ||
       check(getTok().isNot(AsmToken::String),
             "unexpected token in '.cv_file' directive") ||
-      parseEscapedString(Filename))
+      // Usually directory and filename are together, otherwise just
+      // directory. Allow the strings to have escaped octal character sequence.
+      parseEscapedString(Filename) ||
+      parseToken(AsmToken::EndOfStatement,
+                 "unexpected token in '.cv_file' directive"))
     return true;
-  if (!parseOptionalToken(AsmToken::EndOfStatement)) {
-    if (check(getTok().isNot(AsmToken::String),
-              "unexpected token in '.cv_file' directive") ||
-        parseEscapedString(Checksum) ||
-        parseIntToken(ChecksumKind,
-                      "expected checksum kind in '.cv_file' directive") ||
-        parseToken(AsmToken::EndOfStatement,
-                   "unexpected token in '.cv_file' directive"))
-      return true;
-  }
 
-  if (!getStreamer().EmitCVFileDirective(FileNumber, Filename, Checksum,
-                                         static_cast<uint8_t>(ChecksumKind)))
+  if (!getStreamer().EmitCVFileDirective(FileNumber, Filename))
     return Error(FileNumberLoc, "file number already allocated");
 
   return false;
@@ -3767,18 +3754,6 @@ bool AsmParser::parseDirectiveCVFileChecksums() {
   return false;
 }
 
-/// parseDirectiveCVFileChecksumOffset
-/// ::= .cv_filechecksumoffset fileno
-bool AsmParser::parseDirectiveCVFileChecksumOffset() {
-  int64_t FileNo;
-  if (parseIntToken(FileNo, "expected identifier in directive"))
-    return true;
-  if (parseToken(AsmToken::EndOfStatement, "Expected End of Statement"))
-    return true;
-  getStreamer().EmitCVFileChecksumOffsetDirective(FileNo);
-  return false;
-}
-
 /// parseDirectiveCFISections
 /// ::= .cfi_sections section [, section]
 bool AsmParser::parseDirectiveCFISections() {
@@ -5161,7 +5136,6 @@ void AsmParser::initializeDirectiveKindMap() {
   DirectiveKindMap[".cv_def_range"] = DK_CV_DEF_RANGE;
   DirectiveKindMap[".cv_stringtable"] = DK_CV_STRINGTABLE;
   DirectiveKindMap[".cv_filechecksums"] = DK_CV_FILECHECKSUMS;
-  DirectiveKindMap[".cv_filechecksumoffset"] = DK_CV_FILECHECKSUM_OFFSET;
   DirectiveKindMap[".sleb128"] = DK_SLEB128;
   DirectiveKindMap[".uleb128"] = DK_ULEB128;
   DirectiveKindMap[".cfi_sections"] = DK_CFI_SECTIONS;
index cd5be8816ac4ace5afbc12c3916c4bc7cb814f45..b9812c3ef96e7fce345d1bdf3fd856f4235af8ad 100644 (file)
@@ -228,11 +228,8 @@ void MCStreamer::EnsureValidDwarfFrame() {
     report_fatal_error("No open frame");
 }
 
-bool MCStreamer::EmitCVFileDirective(unsigned FileNo, StringRef Filename,
-                                     StringRef Checksum,
-                                     unsigned ChecksumKind) {
-  return getContext().getCVContext().addFile(*this, FileNo, Filename, Checksum,
-                                             ChecksumKind);
+bool MCStreamer::EmitCVFileDirective(unsigned FileNo, StringRef Filename) {
+  return getContext().getCVContext().addFile(FileNo, Filename);
 }
 
 bool MCStreamer::EmitCVFuncIdDirective(unsigned FunctionId) {
index cfe530024df6c3eed39ea55c149b5df2a70bcfba..ddfd5e056a1b9e64f5ee122f109d2a616bcfa3ea 100644 (file)
 ; ASM: .long   0
 ; ASM: # Inlined function bar starts at t.cpp:8
 ; ASM: .long   4098                    # Type index of inlined function
-; ASM: .cv_filechecksumoffset 1        # Offset into filechecksum table
+; ASM: .long   0                       # Offset into filechecksum table
 ; ASM: .long   8                       # Starting line number
 ; ASM: # Inlined function foo starts at t.cpp:2
 ; ASM: .long   4099
-; ASM: .cv_filechecksumoffset 1        # Offset into filechecksum table
+; ASM: .long   0
 ; ASM: .long   2
 ; ASM: [[inline_end]]:
 
@@ -72,8 +72,6 @@
 ; ASM: .short  4430
 ; ASM: .short  4430
 
-; ASM: .cv_filechecksums
-
 ; ASM: .section .debug$T,"dr"
 ; ASM: .long 4 # Debug section magic
 ; ASM: # ArgList (0x1000) {
index 9f251a4f8ffc20ea9bf25a2b10aa941c06a5a99c..8af99a6063e6617800fc0fe3cb4869235c1d5191 100644 (file)
 
 ; X86-LABEL: _f:
 ; X86:      # BB
-; X86:      .cv_file 1 "D:\\one.c" "70b51f534d80639d033ae92c6a856af6" 1
+; X86:      .cv_file 1 "D:\\one.c"
 ; X86:      .cv_loc 0 1 1 0 is_stmt 0 # one.c:1:0
 ; X86:      calll   _g
-; X86:      .cv_file 2 "D:\\two.c" "70b51f534d80639d033ae92c6a856af6" 1
+; X86:      .cv_file 2 "D:\\two.c"
 ; X86:      .cv_loc 0 2 2 0 # two.c:2:0
 ; X86:      calll   _g
 ; X86:      .cv_loc 0 1 7 0 # one.c:7:0
 ; OBJ32-NEXT:   ProcEnd {
 ; OBJ32:        }
 ; OBJ32-NEXT: ]
-; OBJ32:         Subsection [
-; OBJ32:        SubSectionType: FileChecksums (0xF4)
-; OBJ32-NEXT:   SubSectionSize: 0x50
-; OBJ32-NEXT:   FileChecksum {
-; OBJ32-NEXT:     Filename: D:\one.c (0x1)
-; OBJ32-NEXT:     ChecksumSize: 0x20
-; OBJ32-NEXT:     ChecksumKind: MD5 (0x1)
-; OBJ32-NEXT:     ChecksumBytes (
-; OBJ32-NEXT:       0000: 37306235 31663533 34643830 36333964  |70b51f534d80639d|
-; OBJ32-NEXT:       0010: 30333361 65393263 36613835 36616636  |033ae92c6a856af6|
-; OBJ32-NEXT:     )
-; OBJ32-NEXT:   }
-; OBJ32-NEXT:   FileChecksum {
-; OBJ32-NEXT:     Filename: D:\two.c (0xA)
-; OBJ32-NEXT:     ChecksumSize: 0x20
-; OBJ32-NEXT:     ChecksumKind: MD5 (0x1)
-; OBJ32-NEXT:     ChecksumBytes (
-; OBJ32-NEXT:       0000: 37306235 31663533 34643830 36333964  |70b51f534d80639d|
-; OBJ32-NEXT:       0010: 30333361 65393263 36613835 36616636  |033ae92c6a856af6|
-; OBJ32-NEXT:     )
-; OBJ32-NEXT:   }
-; OBJ32-NEXT:  ]
 ; OBJ32:      FunctionLineTable [
 ; OBJ32-NEXT:   Name: _f
 ; OBJ32-NEXT:   Flags: 0x0
 
 ; X64-LABEL: f:
 ; X64-NEXT: .L{{.*}}:{{$}}
-; X64:      .cv_file 1 "D:\\input.c" "70b51f534d80639d033ae92c6a856af6" 1
+; X64:      .cv_file 1 "D:\\input.c"
 ; X64:      .cv_loc 0 1 3 0 is_stmt 0 # input.c:3:0
 ; X64:      # BB
 ; X64:      subq    $40, %rsp
-; X64:      .cv_file 2 "D:\\one.c" "70b51f534d80639d033ae92c6a856af6" 1
+; X64:      .cv_file 2 "D:\\one.c"
 ; X64:      .cv_loc 0 2 1 0 # one.c:1:0
 ; X64:      callq   g
-; X64:      .cv_file 3 "D:\\two.c" "70b51f534d80639d033ae92c6a856af6" 1
+; X64:      .cv_file 3 "D:\\two.c"
 ; X64:      .cv_loc 0 3 2 0 # two.c:2:0
 ; X64:      callq   g
 ; X64:      .cv_loc 0 2 7 0 # one.c:7:0
 ; OBJ64-NEXT:   ProcEnd {
 ; OBJ64:        }
 ; OBJ64-NEXT: ]
-; OBJ64:         Subsection [
-; OBJ64:        SubSectionType: FileChecksums (0xF4)
-; OBJ64-NEXT:   SubSectionSize: 0x78
-; OBJ64-NEXT:   FileChecksum {
-; OBJ64-NEXT:     Filename: D:\input.c (0x1)
-; OBJ64-NEXT:     ChecksumSize: 0x20
-; OBJ64-NEXT:     ChecksumKind: MD5 (0x1)
-; OBJ64-NEXT:     ChecksumBytes (
-; OBJ64-NEXT:       0000: 37306235 31663533 34643830 36333964  |70b51f534d80639d|
-; OBJ64-NEXT:       0010: 30333361 65393263 36613835 36616636  |033ae92c6a856af6|
-; OBJ64-NEXT:     )
-; OBJ64-NEXT:   }
-; OBJ64-NEXT:   FileChecksum {
-; OBJ64-NEXT:     Filename: D:\one.c (0xC)
-; OBJ64-NEXT:     ChecksumSize: 0x20
-; OBJ64-NEXT:     ChecksumKind: MD5 (0x1)
-; OBJ64-NEXT:     ChecksumBytes (
-; OBJ64-NEXT:       0000: 37306235 31663533 34643830 36333964  |70b51f534d80639d|
-; OBJ64-NEXT:       0010: 30333361 65393263 36613835 36616636  |033ae92c6a856af6|
-; OBJ64-NEXT:     )
-; OBJ64-NEXT:   }
-; OBJ64-NEXT:   FileChecksum {
-; OBJ64-NEXT:     Filename: D:\two.c (0x15)
-; OBJ64-NEXT:     ChecksumSize: 0x20
-; OBJ64-NEXT:     ChecksumKind: MD5 (0x1)
-; OBJ64-NEXT:     ChecksumBytes (
-; OBJ64-NEXT:       0000: 37306235 31663533 34643830 36333964  |70b51f534d80639d|
-; OBJ64-NEXT:       0010: 30333361 65393263 36613835 36616636  |033ae92c6a856af6|
-; OBJ64-NEXT:     )
-; OBJ64-NEXT:   }
-; OBJ64-NEXT:  ]
 ; OBJ64:      FunctionLineTable [
 ; OBJ64-NEXT:   Name: f
 ; OBJ64-NEXT:   Flags: 0x0
@@ -238,11 +185,11 @@ attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "
 !llvm.ident = !{!11}
 
 !0 = distinct !DICompileUnit(language: DW_LANG_C99, producer: "clang version 3.5 ", isOptimized: false, emissionKind: FullDebug, file: !1, enums: !2, retainedTypes: !2, globals: !2, imports: !2)
-!1 = !DIFile(filename: "<unknown>", directory: "D:\5C", checksumkind: CSK_MD5, checksum:"70b51f534d80639d033ae92c6a856af6")
+!1 = !DIFile(filename: "<unknown>", directory: "D:\5C")
 !2 = !{}
 !4 = distinct !DISubprogram(name: "f", line: 3, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, scopeLine: 3, file: !5, scope: !6, type: !7, variables: !2)
-!5 = !DIFile(filename: "input.c", directory: "D:\5C", checksumkind: CSK_MD5, checksum:"70b51f534d80639d033ae92c6a856af6")
-!6 = !DIFile(filename: "input.c", directory: "D:C", checksumkind: CSK_MD5, checksum:"70b51f534d80639d033ae92c6a856af6")
+!5 = !DIFile(filename: "input.c", directory: "D:\5C")
+!6 = !DIFile(filename: "input.c", directory: "D:C")
 !7 = !DISubroutineType(types: !8)
 !8 = !{null}
 !9 = !{i32 2, !"CodeView", i32 1}
@@ -250,9 +197,9 @@ attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "
 !11 = !{!"clang version 3.5 "}
 !12 = !DILocation(line: 1, scope: !13)
 !13 = !DILexicalBlockFile(discriminator: 0, file: !14, scope: !4)
-!14 = !DIFile(filename: "one.c", directory: "D:\5C", checksumkind: CSK_MD5, checksum:"70b51f534d80639d033ae92c6a856af6")
+!14 = !DIFile(filename: "one.c", directory: "D:\5C")
 !15 = !DILocation(line: 2, scope: !16)
 !16 = !DILexicalBlockFile(discriminator: 0, file: !17, scope: !4)
-!17 = !DIFile(filename: "two.c", directory: "D:\5C", checksumkind: CSK_MD5, checksum:"70b51f534d80639d033ae92c6a856af6")
+!17 = !DIFile(filename: "two.c", directory: "D:\5C")
 !18 = !DILocation(line: 7, scope: !13)
 !19 = !DILocation(line: 8, scope: !13)
index a76c8958c2b07b852621b0ec3c5aa5e181daeea6..50d121be6942c2f088fb653381371e2e395dbf25 100644 (file)
@@ -17,7 +17,7 @@
 
 ; X86-LABEL: _f:
 ; X86:      # BB
-; X86:      .cv_file 1 "D:\\test.c" "f310ab26998ca831cbdf169e4eecacfa" 1
+; X86:      .cv_file 1 "D:\\test.c"
 ; X86:      .cv_loc 0 1 4 2 is_stmt 0 # test.c:4:2
 ; X86:      calll   _g
 ; X86:      .cv_loc 0 1 5 0 # test.c:5:0
 ; OBJ32-NEXT:   ProcEnd {
 ; OBJ32:        }
 ; OBJ32-NEXT: ]
-; OBJ32:       Subsection [
-; OBJ32:         SubSectionType: FileChecksums (0xF4)
-; OBJ32-NEXT:    SubSectionSize: 0x28
-; OBJ32-NEXT:    FileChecksum {
-; OBJ32-NEXT:      Filename: D:\test.c (0x1)
-; OBJ32-NEXT:      ChecksumSize: 0x20
-; OBJ32-NEXT:      ChecksumKind: MD5 (0x1)
-; OBJ32-NEXT:      ChecksumBytes (
-; OBJ32-NEXT:        0000: 66333130 61623236 39393863 61383331  |f310ab26998ca831|
-; OBJ32-NEXT:        0010: 63626466 31363965 34656563 61636661  |cbdf169e4eecacfa|
-; OBJ32-NEXT:      )
-; OBJ32-NEXT:    }
-; OBJ32-NEXT:  ]
 ; OBJ32:      FunctionLineTable [
 ; OBJ32-NEXT:   Name: _f
 ; OBJ32-NEXT:   Flags: 0x1
 
 ; X64-LABEL: f:
 ; X64-NEXT: .L{{.*}}:{{$}}
-; X64:      .cv_file 1 "D:\\test.c" "f310ab26998ca831cbdf169e4eecacfa" 1
+; X64:      .cv_file 1 "D:\\test.c"
 ; X64:      .cv_loc 0 1 3 0 is_stmt 0 # test.c:3:0
 ; X64:      # BB
 ; X64:      subq    $40, %rsp
 ; OBJ64-NEXT:   ProcEnd {
 ; OBJ64:        }
 ; OBJ64-NEXT: ]
-; OBJ64:       Subsection [
-; OBJ64:         SubSectionType: FileChecksums (0xF4)
-; OBJ64-NEXT:    SubSectionSize: 0x28
-; OBJ64-NEXT:    FileChecksum {
-; OBJ64-NEXT:      Filename: D:\test.c (0x1)
-; OBJ64-NEXT:      ChecksumSize: 0x20
-; OBJ64-NEXT:      ChecksumKind: MD5 (0x1)
-; OBJ64-NEXT:      ChecksumBytes (
-; OBJ64-NEXT:        0000: 66333130 61623236 39393863 61383331  |f310ab26998ca831|
-; OBJ64-NEXT:        0010: 63626466 31363965 34656563 61636661  |cbdf169e4eecacfa|
-; OBJ64-NEXT:      )
-; OBJ64-NEXT:    }
-; OBJ64-NEXT:  ]
 ; OBJ64:      FunctionLineTable [
 ; OBJ64-NEXT:   Name: f
 ; OBJ64-NEXT:   Flags: 0x1
@@ -258,8 +232,8 @@ attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "
 !1 = !DIFile(filename: "<unknown>", directory: "D:\5C")
 !2 = !{}
 !4 = distinct !DISubprogram(name: "f", line: 3, isLocal: false, isDefinition: true, virtualIndex: 6, flags: DIFlagPrototyped, isOptimized: false, unit: !0, scopeLine: 3, file: !5, scope: !6, type: !7, variables: !2)
-!5 = !DIFile(filename: "test.c", directory: "D:\5C", checksumkind: CSK_MD5, checksum: "f310ab26998ca831cbdf169e4eecacfa")
-!6 = !DIFile(filename: "test.c", directory: "D:C", checksumkind: CSK_MD5, checksum: "f310ab26998ca831cbdf169e4eecacfa")
+!5 = !DIFile(filename: "test.c", directory: "D:\5C")
+!6 = !DIFile(filename: "test.c", directory: "D:C")
 !7 = !DISubroutineType(types: !8)
 !8 = !{null}
 !9 = !{i32 2, !"CodeView", i32 1}
index 6c814e8fd3774ad257984ba3d81f6bafa056788f..42da92f385d0b0ac7801237ca2f390f0e6bd2991 100644 (file)
@@ -103,7 +103,7 @@ attributes #0 = { noinline nounwind optnone "correctly-rounded-divide-sqrt-fp-ma
 ; CHECK:     SubSectionType: FileChecksums (0xF4)
 ; CHECK:     FileChecksum {
 ; CHECK:       ChecksumSize: 0x0
-; CHECK:       ChecksumKind: MD5 (0x1)
+; CHECK:       ChecksumKind: None (0x0)
 ; CHECK:       ChecksumBytes: ()
 ; CHECK:     }
 ; CHECK:   ]
index 3ab0ad430b391289fb80e30372bf561db971b077..611b82720e9d9b4123ec163ebe2a7686e28e4650 100644 (file)
@@ -1383,8 +1383,7 @@ TEST_F(DIFileTest, get) {
 
   EXPECT_NE(N, DIFile::get(Context, "other", Directory, CSKind, Checksum));
   EXPECT_NE(N, DIFile::get(Context, Filename, "other", CSKind, Checksum));
-  EXPECT_NE(
-      N, DIFile::get(Context, Filename, Directory, DIFile::CSK_SHA1, Checksum));
+  EXPECT_NE(N, DIFile::get(Context, Filename, Directory, DIFile::CSK_SHA1, Checksum));
   EXPECT_NE(N, DIFile::get(Context, Filename, Directory));
 
   TempDIFile Temp = N->clone();