diff options
Diffstat (limited to 'llvm/lib/MC')
-rw-r--r-- | llvm/lib/MC/MCAsmStreamer.cpp | 27 | ||||
-rw-r--r-- | llvm/lib/MC/MCCodeView.cpp | 119 | ||||
-rw-r--r-- | llvm/lib/MC/MCObjectStreamer.cpp | 3 | ||||
-rw-r--r-- | llvm/lib/MC/MCParser/AsmParser.cpp | 40 | ||||
-rw-r--r-- | llvm/lib/MC/MCStreamer.cpp | 7 |
5 files changed, 42 insertions, 154 deletions
diff --git a/llvm/lib/MC/MCAsmStreamer.cpp b/llvm/lib/MC/MCAsmStreamer.cpp index 69f4a5d0147..934a6c33484 100644 --- a/llvm/lib/MC/MCAsmStreamer.cpp +++ b/llvm/lib/MC/MCAsmStreamer.cpp @@ -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"; diff --git a/llvm/lib/MC/MCCodeView.cpp b/llvm/lib/MC/MCCodeView.cpp index ad6d9e5a5d8..92b1e12da55 100644 --- a/llvm/lib/MC/MCCodeView.cpp +++ b/llvm/lib/MC/MCCodeView.cpp @@ -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); } diff --git a/llvm/lib/MC/MCObjectStreamer.cpp b/llvm/lib/MC/MCObjectStreamer.cpp index e9e3133582c..174397e2739 100644 --- a/llvm/lib/MC/MCObjectStreamer.cpp +++ b/llvm/lib/MC/MCObjectStreamer.cpp @@ -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); diff --git a/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp index 6e4f8e26b53..ee3cc8d80a6 100644 --- a/llvm/lib/MC/MCParser/AsmParser.cpp +++ b/llvm/lib/MC/MCParser/AsmParser.cpp @@ -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; diff --git a/llvm/lib/MC/MCStreamer.cpp b/llvm/lib/MC/MCStreamer.cpp index cd5be8816ac..b9812c3ef96 100644 --- a/llvm/lib/MC/MCStreamer.cpp +++ b/llvm/lib/MC/MCStreamer.cpp @@ -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) { |