From: Saleem Abdulrasool Date: Wed, 16 Apr 2014 04:15:32 +0000 (+0000) Subject: COFF: add support for .file symbols X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=73a7844c654e262cafaaf3eb96df0034d878996e;p=oota-llvm.git 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). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@206355 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/MC/WinCOFFObjectWriter.cpp b/lib/MC/WinCOFFObjectWriter.cpp index 208dc476bdd..e98777894a7 100644 --- a/lib/MC/WinCOFFObjectWriter.cpp +++ b/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/lib/MC/WinCOFFStreamer.cpp b/lib/MC/WinCOFFStreamer.cpp index f422a7437ea..9f033d415dd 100644 --- a/lib/MC/WinCOFFStreamer.cpp +++ b/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. diff --git a/test/MC/COFF/file.s b/test/MC/COFF/file.s new file mode 100644 index 00000000000..a258693839c --- /dev/null +++ b/test/MC/COFF/file.s @@ -0,0 +1,17 @@ +// RUN: llvm-mc -triple i686-windows -filetype obj %s -o - | llvm-objdump -t - \ +// RUN: | FileCheck %s -check-prefix CHECK-PRINT + + .file "null-padded.asm" +// CHECK-PRINT: .file +// CHECK-PRINT-NEXT: AUX null-padded.asm{{$}} + + .file "eighteen-chars.asm" + +// CHECK-PRINT: .file +// CHECK-PRINT-NEXT: AUX eighteen-chars.asm{{$}} + + .file "multiple-auxiliary-entries.asm" + +// CHECK-PRINT: .file +// CHECK-PRINT-NEXT: AUX multiple-auxiliary-entries.asm{{$}} +