forked from OSchip/llvm-project
[XCOFF] write the real source file name in C_FILE symbol.
The symbol table starts with all the C_FILE symbols. Reviewed By: shchenz Differential Revision: https://reviews.llvm.org/D126623
This commit is contained in:
parent
979400be78
commit
d29e986ed5
|
@ -201,6 +201,7 @@ class XCOFFObjectWriter : public MCObjectWriter {
|
|||
uint16_t SectionCount = 0;
|
||||
uint64_t RelocationEntryOffset = 0;
|
||||
StringRef SourceFileName = ".file";
|
||||
std::vector<std::pair<std::string, size_t>> FileNames;
|
||||
|
||||
support::endian::Writer W;
|
||||
std::unique_ptr<MCXCOFFObjectTargetWriter> TargetObjectWriter;
|
||||
|
@ -494,9 +495,14 @@ void XCOFFObjectWriter::executePostLayoutBinding(MCAssembler &Asm,
|
|||
Strings.add(XSym->getSymbolTableName());
|
||||
}
|
||||
|
||||
// The first symbol entry is for the source file's name.
|
||||
if (nameShouldBeInStringTable(SourceFileName))
|
||||
Strings.add(SourceFileName);
|
||||
FileNames = Asm.getFileNames();
|
||||
// Emit ".file" as the source file name when there is no file name.
|
||||
if (FileNames.empty())
|
||||
FileNames.emplace_back(".file", 0);
|
||||
for (const std::pair<std::string, size_t> &F : FileNames) {
|
||||
if (nameShouldBeInStringTable(F.first))
|
||||
Strings.add(F.first);
|
||||
}
|
||||
|
||||
Strings.finalize();
|
||||
assignAddressesAndIndices(Layout);
|
||||
|
@ -853,15 +859,14 @@ void XCOFFObjectWriter::writeRelocations() {
|
|||
}
|
||||
|
||||
void XCOFFObjectWriter::writeSymbolTable(const MCAsmLayout &Layout) {
|
||||
// Write symbol 0 as C_FILE.
|
||||
// Write C_FILE symbols.
|
||||
// The n_name of a C_FILE symbol is the source file's name when no auxiliary
|
||||
// entries are present. The source file's name is alternatively provided by an
|
||||
// auxiliary entry, in which case the n_name of the C_FILE symbol is `.file`.
|
||||
// FIXME: add the real source file's name.
|
||||
writeSymbolEntry(SourceFileName, /*Value=*/0,
|
||||
XCOFF::ReservedSectionNum::N_DEBUG,
|
||||
/*SymbolType=*/0, XCOFF::C_FILE,
|
||||
/*NumberOfAuxEntries=*/0);
|
||||
// entries are present.
|
||||
for (const std::pair<std::string, size_t> &F : FileNames) {
|
||||
writeSymbolEntry(F.first, /*Value=*/0, XCOFF::ReservedSectionNum::N_DEBUG,
|
||||
/*SymbolType=*/0, XCOFF::C_FILE,
|
||||
/*NumberOfAuxEntries=*/0);
|
||||
}
|
||||
|
||||
for (const auto &Csect : UndefinedCsects) {
|
||||
writeSymbolEntryForControlSection(Csect, XCOFF::ReservedSectionNum::N_UNDEF,
|
||||
|
@ -957,8 +962,8 @@ void XCOFFObjectWriter::finalizeSectionInfo() {
|
|||
}
|
||||
|
||||
void XCOFFObjectWriter::assignAddressesAndIndices(const MCAsmLayout &Layout) {
|
||||
// The first symbol table entry (at index 0) is for the file name.
|
||||
uint32_t SymbolTableIndex = 1;
|
||||
// The symbol table starts with all the C_FILE symbols.
|
||||
uint32_t SymbolTableIndex = FileNames.size();
|
||||
|
||||
// Calculate indices for undefined symbols.
|
||||
for (auto &Csect : UndefinedCsects) {
|
||||
|
|
|
@ -66,7 +66,7 @@ declare extern_weak void @foo_ext_weak(i32*)
|
|||
; CHECKSYM: Symbols [
|
||||
; CHECKSYM-NEXT: Symbol {
|
||||
; CHECKSYM-NEXT: Index: 0
|
||||
; CHECKSYM-NEXT: Name: .file
|
||||
; CHECKSYM-NEXT: Name: <stdin>
|
||||
; CHECKSYM-NEXT: Value (SymbolTableIndex): 0x0
|
||||
; CHECKSYM-NEXT: Section: N_DEBUG
|
||||
; CHECKSYM-NEXT: Source Language ID: TB_C (0x0)
|
||||
|
|
|
@ -89,7 +89,7 @@ declare i32 @bar_extern(i32*)
|
|||
; CHECKSYM: Symbols [
|
||||
; CHECKSYM-NEXT: Symbol {
|
||||
; CHECKSYM-NEXT: Index: 0
|
||||
; CHECKSYM-NEXT: Name: .file
|
||||
; CHECKSYM-NEXT: Name: <stdin>
|
||||
; CHECKSYM-NEXT: Value (SymbolTableIndex): 0x0
|
||||
; CHECKSYM-NEXT: Section: N_DEBUG
|
||||
; CHECKSYM-NEXT: Source Language ID: TB_C (0x0)
|
||||
|
|
|
@ -13,7 +13,7 @@ entry:
|
|||
; CHECK-NEXT: AddressSize: 32bit
|
||||
; CHECK: Symbol {
|
||||
; CHECK-NEXT: Index: 0
|
||||
; CHECK-NEXT: Name: .file
|
||||
; CHECK-NEXT: Name: <stdin>
|
||||
; CHECK-NEXT: Value (SymbolTableIndex): 0x0
|
||||
; CHECK-NEXT: Section: N_DEBUG
|
||||
; CHECK-NEXT: Source Language ID: TB_C (0x0)
|
||||
|
|
|
@ -39,7 +39,7 @@ declare void @llvm.memset.p0i8.i32(i8* nocapture writeonly, i8, i32, i1 immarg)
|
|||
|
||||
; CHECKSYM: Symbol {
|
||||
; CHECKSYM-NEXT: Index: 0
|
||||
; CHECKSYM-NEXT: Name: .file
|
||||
; CHECKSYM-NEXT: Name: <stdin>
|
||||
; CHECKSYM-NEXT: Value (SymbolTableIndex): 0x0
|
||||
; CHECKSYM-NEXT: Section: N_DEBUG
|
||||
; CHECKSYM-NEXT: Source Language ID: TB_C (0x0)
|
||||
|
|
|
@ -210,7 +210,7 @@ entry:
|
|||
; SYM-NEXT: Symbols [
|
||||
; SYM-NEXT: Symbol {
|
||||
; SYM-NEXT: Index: 0
|
||||
; SYM-NEXT: Name: .file
|
||||
; SYM-NEXT: Name: <stdin>
|
||||
; SYM-NEXT: Value (SymbolTableIndex): 0x0
|
||||
; SYM-NEXT: Section: N_DEBUG
|
||||
; SYM-NEXT: Source Language ID: TB_C (0x0)
|
||||
|
|
|
@ -171,7 +171,7 @@ entry:
|
|||
; SYM-NEXT: Symbols [
|
||||
; SYM-NEXT: Symbol {
|
||||
; SYM-NEXT: Index: 0
|
||||
; SYM-NEXT: Name: .file
|
||||
; SYM-NEXT: Name: <stdin>
|
||||
; SYM-NEXT: Value (SymbolTableIndex): 0x0
|
||||
; SYM-NEXT: Section: N_DEBUG
|
||||
; SYM-NEXT: Source Language ID: TB_C (0x0)
|
||||
|
|
|
@ -66,7 +66,7 @@
|
|||
; SYMS-NEXT: Symbols [
|
||||
; SYMS-NEXT: Symbol {
|
||||
; SYMS-NEXT: Index: 0
|
||||
; SYMS-NEXT: Name: .file
|
||||
; SYMS-NEXT: Name: <stdin>
|
||||
; SYMS-NEXT: Value (SymbolTableIndex): 0x0
|
||||
; SYMS-NEXT: Section: N_DEBUG
|
||||
; SYMS-NEXT: Source Language ID: TB_C (0x0)
|
||||
|
|
|
@ -101,7 +101,7 @@ entry:
|
|||
; CHECKSYM: Symbols [
|
||||
; CHECKSYM-NEXT: Symbol {
|
||||
; CHECKSYM-NEXT: Index: 0
|
||||
; CHECKSYM-NEXT: Name: .file
|
||||
; CHECKSYM-NEXT: Name: <stdin>
|
||||
; CHECKSYM-NEXT: Value (SymbolTableIndex): 0x0
|
||||
; CHECKSYM-NEXT: Section: N_DEBUG
|
||||
; CHECKSYM-NEXT: Source Language ID: TB_C (0x0)
|
||||
|
|
|
@ -208,7 +208,7 @@
|
|||
; SYMS: Symbols [
|
||||
; SYMS-NEXT: Symbol {
|
||||
; SYMS-NEXT: Index: 0
|
||||
; SYMS-NEXT: Name: .file
|
||||
; SYMS-NEXT: Name: <stdin>
|
||||
; SYMS-NEXT: Value (SymbolTableIndex): 0x0
|
||||
; SYMS-NEXT: Section: N_DEBUG
|
||||
; SYMS-NEXT: Source Language ID: TB_C (0x0)
|
||||
|
|
|
@ -159,7 +159,7 @@ declare i32 @bar(i32)
|
|||
; SYM: Symbols [
|
||||
; SYM-NEXT: Symbol {
|
||||
; SYM-NEXT: Index: 0
|
||||
; SYM-NEXT: Name: .file
|
||||
; SYM-NEXT: Name: <stdin>
|
||||
; SYM-NEXT: Value (SymbolTableIndex): 0x0
|
||||
; SYM-NEXT: Section: N_DEBUG
|
||||
; SYM-NEXT: Source Language ID: TB_C (0x0)
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
## Emit ".file" as the source file name when there is no file name.
|
||||
# RUN: llvm-mc -triple powerpc-ibm-aix-xcoff %s -filetype=obj -o - | \
|
||||
# RUN: llvm-objdump --syms - | FileCheck %s
|
||||
|
||||
.globl .var1
|
||||
.var1:
|
||||
.globl .var2
|
||||
.var2:
|
||||
|
||||
# CHECK: SYMBOL TABLE:
|
||||
# CHECK-NEXT: 00000000 df *DEBUG* 00000000 .file
|
||||
# CHECK-NEXT: 00000000 l .text 00000000 .text
|
||||
# CHECK-NEXT: 00000000 g F .text (csect: .text) 00000000 .var1
|
||||
# CHECK-NEXT: 00000000 g F .text (csect: .text) 00000000 .var2
|
|
@ -0,0 +1,19 @@
|
|||
## Check mutiple C_FILE symbols are emitted.
|
||||
# RUN: llvm-mc -triple powerpc-ibm-aix-xcoff %s -filetype=obj -o - | \
|
||||
# RUN: llvm-objdump --syms - | FileCheck %s
|
||||
|
||||
.file "1.c"
|
||||
.globl .var1
|
||||
.var1:
|
||||
.file "2.c"
|
||||
.globl .var2
|
||||
.var2:
|
||||
.file "3.c"
|
||||
|
||||
# CHECK: SYMBOL TABLE:
|
||||
# CHECK-NEXT: 00000000 df *DEBUG* 00000000 1.c
|
||||
# CHECK-NEXT: 00000000 df *DEBUG* 00000000 2.c
|
||||
# CHECK-NEXT: 00000000 df *DEBUG* 00000000 3.c
|
||||
# CHECK-NEXT: 00000000 l .text 00000000 .text
|
||||
# CHECK-NEXT: 00000000 g F .text (csect: .text) 00000000 .var1
|
||||
# CHECK-NEXT: 00000000 g F .text (csect: .text) 00000000 .var2
|
|
@ -66,7 +66,7 @@ entry:
|
|||
}
|
||||
|
||||
; SYM: SYMBOL TABLE:
|
||||
; SYM-NEXT: 00000000 df *DEBUG* 00000000 .file
|
||||
; SYM-NEXT: 00000000 df *DEBUG* 00000000 <stdin>
|
||||
; SYM-NEXT: 00000000 *UND* 00000000 ei
|
||||
; SYM-NEXT: 00000000 l .text 00000091 .text
|
||||
; SYM-NEXT: 00000000 g F .text (csect: .text) 00000000 .bar
|
||||
|
@ -88,7 +88,7 @@ entry:
|
|||
; SYM-NEXT: 000000ec l O *COM* 00000004 si
|
||||
|
||||
; SYM-DES: SYMBOL TABLE:
|
||||
; SYM-DES-NEXT: 00000000 df *DEBUG* 00000000 (idx: 0) .file
|
||||
; SYM-DES-NEXT: 00000000 df *DEBUG* 00000000 (idx: 0) <stdin>
|
||||
; SYM-DES-NEXT: 00000000 *UND* 00000000 (idx: 1) ei[UA]
|
||||
; SYM-DES-NEXT: 00000000 l .text 00000091 (idx: 3) .text[PR]
|
||||
; SYM-DES-NEXT: 00000000 g F .text (csect: (idx: 3) .text[PR]) 00000000 (idx: 5) .bar
|
||||
|
|
Loading…
Reference in New Issue