diff options
author | Paul Robinson <paul.robinson@sony.com> | 2018-03-06 03:15:21 +0000 |
---|---|---|
committer | Paul Robinson <paul.robinson@sony.com> | 2018-03-06 03:15:21 +0000 |
commit | 732e443bb9eebf5ba1a9dbf0df1104057b8fa2ac (patch) | |
tree | 7c68da8169bdcb4fed36bfd21290d33ff3a7ddfc /llvm/lib/MC | |
parent | 8fd561f572b8992f3e1b94192e0285fbd237636b (diff) | |
download | bcm5719-llvm-732e443bb9eebf5ba1a9dbf0df1104057b8fa2ac.tar.gz bcm5719-llvm-732e443bb9eebf5ba1a9dbf0df1104057b8fa2ac.zip |
Revert "[DWARFv5] Emit file 0 to the line table."
Caused an asan failure.
This reverts commit d54883f081186cdcce74e6f98cfc0438579ec019.
aka r326758
llvm-svn: 326762
Diffstat (limited to 'llvm/lib/MC')
-rw-r--r-- | llvm/lib/MC/MCAsmStreamer.cpp | 86 | ||||
-rw-r--r-- | llvm/lib/MC/MCDwarf.cpp | 61 | ||||
-rw-r--r-- | llvm/lib/MC/MCParser/AsmParser.cpp | 6 | ||||
-rw-r--r-- | llvm/lib/MC/MCStreamer.cpp | 9 |
4 files changed, 57 insertions, 105 deletions
diff --git a/llvm/lib/MC/MCAsmStreamer.cpp b/llvm/lib/MC/MCAsmStreamer.cpp index 0a006ecf66d..f254cb50b60 100644 --- a/llvm/lib/MC/MCAsmStreamer.cpp +++ b/llvm/lib/MC/MCAsmStreamer.cpp @@ -218,10 +218,6 @@ public: MD5::MD5Result *Checksum = 0, Optional<StringRef> Source = None, unsigned CUID = 0) override; - void emitDwarfFile0Directive(StringRef Directory, StringRef Filename, - MD5::MD5Result *Checksum, - Optional<StringRef> Source, - unsigned CUID = 0) override; void EmitDwarfLocDirective(unsigned FileNo, unsigned Line, unsigned Column, unsigned Flags, unsigned Isa, unsigned Discriminator, @@ -1080,10 +1076,21 @@ void MCAsmStreamer::EmitFileDirective(StringRef Filename) { EmitEOL(); } -void printDwarfFileDirective(unsigned FileNo, StringRef Directory, - StringRef Filename, MD5::MD5Result *Checksum, - Optional<StringRef> Source, bool UseDwarfDirectory, - raw_svector_ostream &OS) { +Expected<unsigned> MCAsmStreamer::tryEmitDwarfFileDirective( + unsigned FileNo, StringRef Directory, StringRef Filename, + MD5::MD5Result *Checksum, Optional<StringRef> Source, unsigned CUID) { + assert(CUID == 0); + + MCDwarfLineTable &Table = getContext().getMCDwarfLineTable(CUID); + unsigned NumFiles = Table.getMCDwarfFiles().size(); + Expected<unsigned> FileNoOrErr = + Table.tryGetFile(Directory, Filename, Checksum, Source, FileNo); + if (!FileNoOrErr) + return FileNoOrErr.takeError(); + FileNo = FileNoOrErr.get(); + if (NumFiles == Table.getMCDwarfFiles().size()) + return FileNo; + SmallString<128> FullPathName; if (!UseDwarfDirectory && !Directory.empty()) { @@ -1097,68 +1104,31 @@ void printDwarfFileDirective(unsigned FileNo, StringRef Directory, } } - OS << "\t.file\t" << FileNo << ' '; + SmallString<128> Str; + raw_svector_ostream OS1(Str); + OS1 << "\t.file\t" << FileNo << ' '; if (!Directory.empty()) { - PrintQuotedString(Directory, OS); - OS << ' '; + PrintQuotedString(Directory, OS1); + OS1 << ' '; } - PrintQuotedString(Filename, OS); + PrintQuotedString(Filename, OS1); if (Checksum) { - OS << " md5 "; - PrintQuotedString(Checksum->digest(), OS); + OS1 << " md5 "; + PrintQuotedString(Checksum->digest(), OS1); } if (Source) { - OS << " source "; - PrintQuotedString(*Source, OS); + OS1 << " source "; + PrintQuotedString(*Source, OS1); } -} - -Expected<unsigned> MCAsmStreamer::tryEmitDwarfFileDirective( - unsigned FileNo, StringRef Directory, StringRef Filename, - MD5::MD5Result *Checksum, Optional<StringRef> Source, unsigned CUID) { - assert(CUID == 0 && "multiple CUs not supported by MCAsmStreamer"); - - MCDwarfLineTable &Table = getContext().getMCDwarfLineTable(CUID); - unsigned NumFiles = Table.getMCDwarfFiles().size(); - Expected<unsigned> FileNoOrErr = - Table.tryGetFile(Directory, Filename, Checksum, Source, FileNo); - if (!FileNoOrErr) - return FileNoOrErr.takeError(); - FileNo = FileNoOrErr.get(); - if (NumFiles == Table.getMCDwarfFiles().size()) - return FileNo; - - SmallString<128> Str; - raw_svector_ostream OS1(Str); - printDwarfFileDirective(FileNo, Directory, Filename, Checksum, Source, - UseDwarfDirectory, OS1); - - if (MCTargetStreamer *TS = getTargetStreamer()) + if (MCTargetStreamer *TS = getTargetStreamer()) { TS->emitDwarfFileDirective(OS1.str()); - else + } else { EmitRawText(OS1.str()); + } return FileNo; } -void MCAsmStreamer::emitDwarfFile0Directive(StringRef Directory, - StringRef Filename, - MD5::MD5Result *Checksum, - Optional<StringRef> Source, - unsigned CUID) { - assert(CUID == 0); - - SmallString<128> Str; - raw_svector_ostream OS1(Str); - printDwarfFileDirective(0, Directory, Filename, Checksum, Source, - UseDwarfDirectory, OS1); - - if (MCTargetStreamer *TS = getTargetStreamer()) - TS->emitDwarfFileDirective(OS1.str()); - else - EmitRawText(OS1.str()); -} - void MCAsmStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line, unsigned Column, unsigned Flags, unsigned Isa, diff --git a/llvm/lib/MC/MCDwarf.cpp b/llvm/lib/MC/MCDwarf.cpp index ee675acd530..685b46a606d 100644 --- a/llvm/lib/MC/MCDwarf.cpp +++ b/llvm/lib/MC/MCDwarf.cpp @@ -346,34 +346,6 @@ void MCDwarfLineTableHeader::emitV2FileDirTables(MCStreamer *MCOS) const { MCOS->EmitIntValue(0, 1); // Terminate the file list. } -static void emitOneV5FileEntry(MCStreamer *MCOS, const MCDwarfFile &DwarfFile, - bool HasMD5, bool HasSource, - Optional<MCDwarfLineStr> &LineStr) { - assert(!DwarfFile.Name.empty()); - if (LineStr) - LineStr->emitRef(MCOS, DwarfFile.Name); - else { - MCOS->EmitBytes(DwarfFile.Name); // FileName and... - MCOS->EmitBytes(StringRef("\0", 1)); // its null terminator. - } - MCOS->EmitULEB128IntValue(DwarfFile.DirIndex); // Directory number. - if (HasMD5) { - MD5::MD5Result *Cksum = DwarfFile.Checksum; - MCOS->EmitBinaryData( - StringRef(reinterpret_cast<const char *>(Cksum->Bytes.data()), - Cksum->Bytes.size())); - } - if (HasSource) { - if (LineStr) - LineStr->emitRef(MCOS, DwarfFile.Source.getValueOr(StringRef())); - else { - MCOS->EmitBytes( - DwarfFile.Source.getValueOr(StringRef())); // Source and... - MCOS->EmitBytes(StringRef("\0", 1)); // its null terminator. - } - } -} - void MCDwarfLineTableHeader::emitV5FileDirTables( MCStreamer *MCOS, Optional<MCDwarfLineStr> &LineStr) const { // The directory format, which is just a list of the directory paths. In a @@ -422,12 +394,33 @@ void MCDwarfLineTableHeader::emitV5FileDirTables( MCOS->EmitULEB128IntValue(LineStr ? dwarf::DW_FORM_line_strp : dwarf::DW_FORM_string); } - // Then the counted list of files. The root file is file #0, then emit the - // files as provide by .file directives. - MCOS->EmitULEB128IntValue(MCDwarfFiles.size()); - emitOneV5FileEntry(MCOS, RootFile, HasMD5, HasSource, LineStr); - for (unsigned i = 1; i < MCDwarfFiles.size(); ++i) - emitOneV5FileEntry(MCOS, MCDwarfFiles[i], HasMD5, HasSource, LineStr); + // Then the list of file names. These start at 1. + MCOS->EmitULEB128IntValue(MCDwarfFiles.size() - 1); + for (unsigned i = 1; i < MCDwarfFiles.size(); ++i) { + assert(!MCDwarfFiles[i].Name.empty()); + if (LineStr) + LineStr->emitRef(MCOS, MCDwarfFiles[i].Name); + else { + MCOS->EmitBytes(MCDwarfFiles[i].Name); // FileName and... + MCOS->EmitBytes(StringRef("\0", 1)); // its null terminator. + } + MCOS->EmitULEB128IntValue(MCDwarfFiles[i].DirIndex); // Directory number. + if (HasMD5) { + MD5::MD5Result *Cksum = MCDwarfFiles[i].Checksum; + MCOS->EmitBinaryData( + StringRef(reinterpret_cast<const char *>(Cksum->Bytes.data()), + Cksum->Bytes.size())); + } + if (HasSource) { + if (LineStr) + LineStr->emitRef(MCOS, MCDwarfFiles[i].Source.getValueOr(StringRef())); + else { + MCOS->EmitBytes( + MCDwarfFiles[i].Source.getValueOr(StringRef())); // Source and... + MCOS->EmitBytes(StringRef("\0", 1)); // its null terminator. + } + } + } } std::pair<MCSymbol *, MCSymbol *> diff --git a/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp index 062c7117b68..76eef5e3725 100644 --- a/llvm/lib/MC/MCParser/AsmParser.cpp +++ b/llvm/lib/MC/MCParser/AsmParser.cpp @@ -3258,8 +3258,8 @@ bool AsmParser::parseDirectiveFile(SMLoc DirectiveLoc) { FileNumber = getTok().getIntVal(); Lex(); - if (FileNumber < 0) - return TokError("negative file number"); + if (FileNumber < 1) + return TokError("file number less than one"); } std::string Path = getTok().getString(); @@ -3338,8 +3338,6 @@ bool AsmParser::parseDirectiveFile(SMLoc DirectiveLoc) { // we turn off -g option, directly use the existing debug info instead. if (getContext().getGenDwarfForAssembly()) getContext().setGenDwarfForAssembly(false); - else if (FileNumber == 0) - getStreamer().emitDwarfFile0Directive(Directory, Filename, CKMem, Source); else { Expected<unsigned> FileNumOrErr = getStreamer().tryEmitDwarfFileDirective( FileNumber, Directory, Filename, CKMem, Source); diff --git a/llvm/lib/MC/MCStreamer.cpp b/llvm/lib/MC/MCStreamer.cpp index eed061dcacd..bf27a0abfda 100644 --- a/llvm/lib/MC/MCStreamer.cpp +++ b/llvm/lib/MC/MCStreamer.cpp @@ -199,15 +199,6 @@ MCStreamer::tryEmitDwarfFileDirective(unsigned FileNo, StringRef Directory, Source, CUID); } -void MCStreamer::emitDwarfFile0Directive(StringRef Directory, - StringRef Filename, - MD5::MD5Result *Checksum, - Optional<StringRef> Source, - unsigned CUID) { - getContext().setMCLineTableRootFile(CUID, Directory, Filename, Checksum, - Source); -} - void MCStreamer::EmitDwarfLocDirective(unsigned FileNo, unsigned Line, unsigned Column, unsigned Flags, unsigned Isa, |