diff options
author | Saleem Abdulrasool <compnerd@compnerd.org> | 2014-04-16 04:15:32 +0000 |
---|---|---|
committer | Saleem Abdulrasool <compnerd@compnerd.org> | 2014-04-16 04:15:32 +0000 |
commit | a2bf05aa2fede796f52a40cd6b9115165800db24 (patch) | |
tree | 238bc53a42ca293b6f827be2185c098606f71726 /llvm/lib/MC | |
parent | 3b5e00130e9601d31c22bf15c846aaff476b7647 (diff) | |
download | bcm5719-llvm-a2bf05aa2fede796f52a40cd6b9115165800db24.tar.gz bcm5719-llvm-a2bf05aa2fede796f52a40cd6b9115165800db24.zip |
COFF: add support for .file symbols
Add support for emitting .file records. This is mostly a quality of
implementation change (more complete support for COFF file emission) that was
noticed while working on COFF file emission for Windows on ARM.
A .file record is emitted as a symbol with storage class FILE (103) and the name
".file". A series of auxiliary format 4 records follow which contain the file
name. The filename is stored as an ANSI string and is padded with NULL if the
length is not a multiple of COFF::SymbolSize (18).
llvm-svn: 206355
Diffstat (limited to 'llvm/lib/MC')
-rw-r--r-- | llvm/lib/MC/WinCOFFObjectWriter.cpp | 29 | ||||
-rw-r--r-- | llvm/lib/MC/WinCOFFStreamer.cpp | 3 |
2 files changed, 30 insertions, 2 deletions
diff --git a/llvm/lib/MC/WinCOFFObjectWriter.cpp b/llvm/lib/MC/WinCOFFObjectWriter.cpp index 208dc476bdd..e98777894a7 100644 --- a/llvm/lib/MC/WinCOFFObjectWriter.cpp +++ b/llvm/lib/MC/WinCOFFObjectWriter.cpp @@ -633,6 +633,35 @@ void WinCOFFObjectWriter::ExecutePostLayoutBinding(MCAssembler &Asm, // "Define" each section & symbol. This creates section & symbol // entries in the staging area. + static_assert(sizeof(COFF::AuxiliaryFile::FileName) == COFF::SymbolSize, + "size mismatch for COFF::AuxiliaryFile::FileName"); + for (auto FI = Asm.file_names_begin(), FE = Asm.file_names_end(); + FI != FE; ++FI) { + // round up to calculate the number of auxiliary symbols required + unsigned Count = (FI->size() + COFF::SymbolSize) / COFF::SymbolSize; + + COFFSymbol *file = createSymbol(".file"); + file->Data.StorageClass = COFF::IMAGE_SYM_CLASS_FILE; + file->Aux.resize(Count); + + unsigned Offset = 0; + unsigned Length = FI->size(); + for (auto & Aux : file->Aux) { + Aux.AuxType = ATFile; + + if (Length > COFF::SymbolSize) { + memcpy(Aux.Aux.File.FileName, FI->c_str() + Offset, COFF::SymbolSize); + Length = Length - COFF::SymbolSize; + } else { + memcpy(Aux.Aux.File.FileName, FI->c_str() + Offset, Length); + memset(&Aux.Aux.File.FileName[Length], 0, COFF::SymbolSize - Length); + Length = 0; + } + + Offset = Offset + COFF::SymbolSize; + } + } + for (MCAssembler::const_iterator i = Asm.begin(), e = Asm.end(); i != e; i++) DefineSection(*i); diff --git a/llvm/lib/MC/WinCOFFStreamer.cpp b/llvm/lib/MC/WinCOFFStreamer.cpp index f422a7437ea..9f033d415dd 100644 --- a/llvm/lib/MC/WinCOFFStreamer.cpp +++ b/llvm/lib/MC/WinCOFFStreamer.cpp @@ -266,8 +266,7 @@ void WinCOFFStreamer::EmitTBSSSymbol(const MCSection *Section, MCSymbol *Symbol, } void WinCOFFStreamer::EmitFileDirective(StringRef Filename) { - // Ignore for now, linkers don't care, and proper debug - // info will be a much large effort. + getAssembler().addFileName(Filename); } // TODO: Implement this if you want to emit .comment section in COFF obj files. |