Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions llvm/include/llvm/BinaryFormat/XCOFF.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ namespace XCOFF {

constexpr size_t FileNamePadSize = 6;
constexpr size_t NameSize = 8;
constexpr size_t AuxFileEntNameSize = 14;
constexpr size_t FileHeaderSize32 = 20;
constexpr size_t FileHeaderSize64 = 24;
constexpr size_t AuxFileHeaderSize32 = 72;
Expand Down
8 changes: 8 additions & 0 deletions llvm/include/llvm/MC/MCAssembler.h
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,8 @@ class MCAssembler {

/// List of declared file names
std::vector<std::pair<std::string, size_t>> FileNames;
// Optional compiler version.
std::string CompilerVersion;

MCDwarfLineTableParams LTParams;

Expand Down Expand Up @@ -486,6 +488,12 @@ class MCAssembler {
FileNames.emplace_back(std::string(FileName), Symbols.size());
}

void setCompilerVersion(std::string CompilerVers) {
if (CompilerVersion.empty())
CompilerVersion = std::move(CompilerVers);
}
StringRef getCompilerVersion() { return CompilerVersion; }

/// Write the necessary bundle padding to \p OS.
/// Expects a fragment \p F containing instructions and its size \p FSize.
void writeFragmentPadding(raw_ostream &OS, const MCEncodedFragment &F,
Expand Down
25 changes: 15 additions & 10 deletions llvm/lib/MC/MCAsmStreamer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1590,17 +1590,22 @@ void MCAsmStreamer::emitFileDirective(StringRef Filename,
assert(MAI->hasFourStringsDotFile());
OS << "\t.file\t";
PrintQuotedString(Filename, OS);
OS << ",";
if (!CompilerVerion.empty()) {
PrintQuotedString(CompilerVerion, OS);
}
if (!TimeStamp.empty()) {
OS << ",";
PrintQuotedString(TimeStamp, OS);
}
if (!Description.empty()) {
bool useTimeStamp = !TimeStamp.empty();
bool useCompilerVersion = !CompilerVerion.empty();
bool useDescription = !Description.empty();
if (useTimeStamp || useCompilerVersion || useDescription) {
OS << ",";
PrintQuotedString(Description, OS);
if (useTimeStamp)
PrintQuotedString(TimeStamp, OS);
if (useCompilerVersion || useDescription) {
OS << ",";
if (useCompilerVersion)
PrintQuotedString(CompilerVerion, OS);
if (useDescription) {
OS << ",";
PrintQuotedString(Description, OS);
}
}
}
EmitEOL();
}
Expand Down
4 changes: 3 additions & 1 deletion llvm/lib/MC/MCObjectStreamer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -902,7 +902,9 @@ void MCObjectStreamer::emitFileDirective(StringRef Filename,
StringRef TimeStamp,
StringRef Description) {
getAssembler().addFileName(Filename);
// TODO: add additional info to integrated assembler.
getAssembler().setCompilerVersion(CompilerVerion.str());
// TODO: add TimeStamp and Description to .file symbol table entry
// with the integrated assembler.
}

void MCObjectStreamer::emitAddrsig() {
Expand Down
75 changes: 64 additions & 11 deletions llvm/lib/MC/XCOFFObjectWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,8 @@ class XCOFFObjectWriter : public MCObjectWriter {
bool is64Bit() const { return TargetObjectWriter->is64Bit(); }
bool nameShouldBeInStringTable(const StringRef &);
void writeSymbolName(const StringRef &);
bool auxFileSymNameShouldBeInStringTable(const StringRef &);
void writeAuxFileSymName(const StringRef &);

void writeSymbolEntryForCsectMemberLabel(const Symbol &SymbolRef,
const XCOFFSection &CSectionRef,
Expand Down Expand Up @@ -391,7 +393,8 @@ class XCOFFObjectWriter : public MCObjectWriter {
const MCAsmLayout &Layout,
CInfoSymSectionEntry &CInfoSymEntry,
uint64_t &CurrentAddressLocation);
void writeSymbolTable(const MCAsmLayout &Layout);
void writeSymbolTable(MCAssembler &Asm, const MCAsmLayout &Layout);
void writeSymbolAuxFileEntry(StringRef &Name, uint8_t ftype);
void writeSymbolAuxDwarfEntry(uint64_t LengthOfSectionPortion,
uint64_t NumberOfRelocEnt = 0);
void writeSymbolAuxCsectEntry(uint64_t SectionOrLength,
Expand All @@ -416,7 +419,7 @@ class XCOFFObjectWriter : public MCObjectWriter {
// *) Assigns symbol table indices.
// *) Builds up the section header table by adding any non-empty sections to
// `Sections`.
void assignAddressesAndIndices(const MCAsmLayout &);
void assignAddressesAndIndices(MCAssembler &Asm, const MCAsmLayout &);
// Called after relocations are recorded.
void finalizeSectionInfo();
void finalizeRelocationInfo(SectionEntry *Sec, uint64_t RelCount);
Expand Down Expand Up @@ -634,12 +637,20 @@ void XCOFFObjectWriter::executePostLayoutBinding(MCAssembler &Asm,
if (FileNames.empty())
FileNames.emplace_back(".file", 0);
for (const std::pair<std::string, size_t> &F : FileNames) {
if (nameShouldBeInStringTable(F.first))
if (auxFileSymNameShouldBeInStringTable(F.first))
Strings.add(F.first);
}

// Always add ".file" to the symbol table. The actual file name will be in
// the AUX_FILE auxiliary entry.
if (nameShouldBeInStringTable(".file"))
Strings.add(".file");
StringRef Vers = Asm.getCompilerVersion();
if (auxFileSymNameShouldBeInStringTable(Vers))
Strings.add(Vers);

Strings.finalize();
assignAddressesAndIndices(Layout);
assignAddressesAndIndices(Asm, Layout);
}

void XCOFFObjectWriter::recordRelocation(MCAssembler &Asm,
Expand Down Expand Up @@ -812,7 +823,7 @@ uint64_t XCOFFObjectWriter::writeObject(MCAssembler &Asm,
writeSectionHeaderTable();
writeSections(Asm, Layout);
writeRelocations();
writeSymbolTable(Layout);
writeSymbolTable(Asm, Layout);
// Write the string table.
Strings.write(W.OS);

Expand Down Expand Up @@ -872,6 +883,36 @@ void XCOFFObjectWriter::writeSymbolAuxCsectEntry(uint64_t SectionOrLength,
}
}

bool XCOFFObjectWriter::auxFileSymNameShouldBeInStringTable(
const StringRef &SymbolName) {
return SymbolName.size() > XCOFF::AuxFileEntNameSize;
}

void XCOFFObjectWriter::writeAuxFileSymName(const StringRef &SymbolName) {
// Magic, Offset or SymbolName.
if (auxFileSymNameShouldBeInStringTable(SymbolName)) {
W.write<int32_t>(0);
W.write<uint32_t>(Strings.getOffset(SymbolName));
W.OS.write_zeros(XCOFF::FileNamePadSize);
} else {
char Name[XCOFF::AuxFileEntNameSize + 1];
std::strncpy(Name, SymbolName.data(), XCOFF::AuxFileEntNameSize);
ArrayRef<char> NameRef(Name, XCOFF::AuxFileEntNameSize);
W.write(NameRef);
}
}

void XCOFFObjectWriter::writeSymbolAuxFileEntry(StringRef &Name,
uint8_t ftype) {
writeAuxFileSymName(Name);
W.write<uint8_t>(ftype);
W.OS.write_zeros(2);
if (is64Bit())
W.write<uint8_t>(XCOFF::AUX_FILE);
else
W.OS.write_zeros(1);
}

void XCOFFObjectWriter::writeSymbolAuxDwarfEntry(
uint64_t LengthOfSectionPortion, uint64_t NumberOfRelocEnt) {
writeWord(LengthOfSectionPortion);
Expand Down Expand Up @@ -1103,8 +1144,11 @@ void XCOFFObjectWriter::writeRelocations() {
writeRelocation(Reloc, *DwarfSection.DwarfSect);
}

void XCOFFObjectWriter::writeSymbolTable(const MCAsmLayout &Layout) {
void XCOFFObjectWriter::writeSymbolTable(MCAssembler &Asm,
const MCAsmLayout &Layout) {
// Write C_FILE symbols.
StringRef Vers = Asm.getCompilerVersion();

for (const std::pair<std::string, size_t> &F : FileNames) {
// The n_name of a C_FILE symbol is the source file's name when no auxiliary
// entries are present.
Expand Down Expand Up @@ -1133,9 +1177,15 @@ void XCOFFObjectWriter::writeSymbolTable(const MCAsmLayout &Layout) {
else
CpuID = XCOFF::TCPU_COM;

writeSymbolEntry(FileName, /*Value=*/0, XCOFF::ReservedSectionNum::N_DEBUG,
int NumberOfFileAuxEntries = 1;
if (!Vers.empty())
++NumberOfFileAuxEntries;
writeSymbolEntry(".file", /*Value=*/0, XCOFF::ReservedSectionNum::N_DEBUG,
/*SymbolType=*/(LangID << 8) | CpuID, XCOFF::C_FILE,
/*NumberOfAuxEntries=*/0);
NumberOfFileAuxEntries);
writeSymbolAuxFileEntry(FileName, XCOFF::XFT_FN);
if (!Vers.empty())
writeSymbolAuxFileEntry(Vers, XCOFF::XFT_CV);
}

if (CInfoSymSection.Entry)
Expand Down Expand Up @@ -1351,9 +1401,12 @@ void XCOFFObjectWriter::addCInfoSymEntry(StringRef Name, StringRef Metadata) {
std::make_unique<CInfoSymInfo>(Name.str(), Metadata.str()));
}

void XCOFFObjectWriter::assignAddressesAndIndices(const MCAsmLayout &Layout) {
// The symbol table starts with all the C_FILE symbols.
uint32_t SymbolTableIndex = FileNames.size();
void XCOFFObjectWriter::assignAddressesAndIndices(MCAssembler &Asm,
const MCAsmLayout &Layout) {
// The symbol table starts with all the C_FILE symbols. Each C_FILE symbol
// requires 1 or 2 auxiliary entries.
uint32_t SymbolTableIndex =
(2 + (Asm.getCompilerVersion().empty() ? 0 : 1)) * FileNames.size();

if (CInfoSymSection.Entry)
SymbolTableIndex++;
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/PowerPC/aix-alias-alignment-2.ll
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ define void @foo3(%struct.B %a1) {
; ASM-NEXT: .vbyte 4, 34

; SYM: SYMBOL TABLE:
; SYM-NEXT: 00000000 df *DEBUG* 00000000 <stdin>
; SYM-NEXT: 00000000 df *DEBUG* 00000000 .file
; SYM-NEXT: 00000000 l .text 0000008a
; SYM-NEXT: 00000000 g F .text (csect: ) 00000000 .foo1
; SYM-NEXT: 00000030 g F .text (csect: ) 00000000 .foo2
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/CodeGen/PowerPC/aix-alias-alignment.ll
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ define void @foo(i32 %a1, i32 %a2, i32 %a3) {
; OBJ-NEXT: c: 4e 80 00 20 blr

; SYM: SYMBOL TABLE:
; SYM-NEXT: 00000000 df *DEBUG* 00000000 <stdin>
; SYM-NEXT: 00000000 df *DEBUG* 00000000 .file
; SYM-NEXT: 00000000 l .text 00000029
; SYM-NEXT: 00000000 g F .text (csect: ) 00000000 .foo
; SYM-NEXT: 0000002c l .data 00000008 .data
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@

; RUN: llc -verify-machineinstrs -mtriple powerpc-ibm-aix-xcoff -mcpu=pwr4 \
; RUN: -mattr=-altivec -filetype=obj -o %t.o < %s
; RUN: llvm-readobj --symbols %t.o | FileCheck --check-prefix=OBJ %s
; RUN: llvm-readobj --symbols %t.o | FileCheck -D#NFA=2 --check-prefix=OBJ %s

; RUN: llc -verify-machineinstrs -mtriple powerpc64-ibm-aix-xcoff -mcpu=pwr4 \
; RUN: -mattr=-altivec -filetype=obj -o %t64.o < %s
; RUN: llvm-readobj --symbols %t64.o | FileCheck --check-prefix=OBJ %s
; RUN: llvm-readobj --symbols %t64.o | FileCheck -D#NFA=2 --check-prefix=OBJ %s

define available_externally i32 @foo(i32 %a) {
entry:
Expand All @@ -27,7 +27,7 @@ entry:
; OBJ-NEXT: StorageClass: C_EXT (0x2)
; OBJ-NEXT: NumberOfAuxEntries: 1
; OBJ-NEXT: CSECT Auxiliary Entry {
; OBJ-NEXT: Index: 2
; OBJ-NEXT: Index: [[#NFA+2]]
; OBJ-NEXT: SectionLen: 0
; OBJ-NEXT: ParameterHashIndex: 0x0
; OBJ-NEXT: TypeChkSectNum: 0x0
Expand All @@ -42,7 +42,7 @@ entry:
; OBJ-NEXT: StorageClass: C_EXT (0x2)
; OBJ-NEXT: NumberOfAuxEntries: 1
; OBJ-NEXT: CSECT Auxiliary Entry {
; OBJ-NEXT: Index: 4
; OBJ-NEXT: Index: [[#NFA+4]]
; OBJ-NEXT: SectionLen: 0
; OBJ-NEXT: ParameterHashIndex: 0x0
; OBJ-NEXT: TypeChkSectNum: 0x0
Expand Down
7 changes: 3 additions & 4 deletions llvm/test/CodeGen/PowerPC/aix-extern-weak.ll
Original file line number Diff line number Diff line change
Expand Up @@ -65,16 +65,15 @@ declare extern_weak void @foo_ext_weak(ptr)
; CHECKSYM: Symbols [
; CHECKSYM-NEXT: Symbol {
; CHECKSYM-NEXT: Index: 0
; CHECKSYM-NEXT: Name: <stdin>
; CHECKSYM-NEXT: Name: .file
; CHECKSYM-NEXT: Value (SymbolTableIndex): 0x0
; CHECKSYM-NEXT: Section: N_DEBUG
; CHECKSYM-NEXT: Source Language ID: TB_CPLUSPLUS (0x9)
; CHECKSYM32-NEXT: CPU Version ID: TCPU_COM (0x3)
; CHECKSYM64-NEXT: CPU Version ID: TCPU_PPC64 (0x2)
; CHECKSYM-NEXT: StorageClass: C_FILE (0x67)
; CHECKSYM-NEXT: NumberOfAuxEntries: 0
; CHECKSYM-NEXT: }
; CHECKSYM-NEXT: Symbol {
; CHECKSYM-NEXT: NumberOfAuxEntries: 2
; CHECKSYM: Symbol {
; CHECKSYM-NEXT: Index: [[#Index:]]
; CHECKSYM-NEXT: Name: .foo_ext_weak
; CHECKSYM-NEXT: Value (RelocatableAddress): 0x0
Expand Down
7 changes: 3 additions & 4 deletions llvm/test/CodeGen/PowerPC/aix-extern.ll
Original file line number Diff line number Diff line change
Expand Up @@ -88,16 +88,15 @@ declare i32 @bar_extern(ptr)
; CHECKSYM: Symbols [
; CHECKSYM-NEXT: Symbol {
; CHECKSYM-NEXT: Index: 0
; CHECKSYM-NEXT: Name: <stdin>
; CHECKSYM-NEXT: Name: .file
; CHECKSYM-NEXT: Value (SymbolTableIndex): 0x0
; CHECKSYM-NEXT: Section: N_DEBUG
; CHECKSYM-NEXT: Source Language ID: TB_CPLUSPLUS (0x9)
; CHECKSYM32-NEXT: CPU Version ID: TCPU_COM (0x3)
; CHECKSYM64-NEXT: CPU Version ID: TCPU_PPC64 (0x2)
; CHECKSYM-NEXT: StorageClass: C_FILE (0x67)
; CHECKSYM-NEXT: NumberOfAuxEntries: 0
; CHECKSYM-NEXT: }
; CHECKSYM-NEXT: Symbol {
; CHECKSYM-NEXT: NumberOfAuxEntries: 2
; CHECKSYM: Symbol {
; CHECKSYM-NEXT: Index: [[#Index:]]
; CHECKSYM-NEXT: Name: .bar_extern
; CHECKSYM-NEXT: Value (RelocatableAddress): 0x0
Expand Down
3 changes: 2 additions & 1 deletion llvm/test/CodeGen/PowerPC/aix-filename-c.ll
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@

source_filename = "1.c"

; OBJ: Name: 1.c
; OBJ: Name: .file
; OBJ: Source Language ID: TB_C (0x0)
; OBJ32: CPU Version ID: TCPU_COM (0x3)
; OBJ64: CPU Version ID: TCPU_PPC64 (0x2)
; OBJ: Name: 1.c
3 changes: 2 additions & 1 deletion llvm/test/CodeGen/PowerPC/aix-filename-cpp.ll
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@

source_filename = "1.cpp"

; OBJ: Name: 1.cpp
; OBJ: Name: .file
; OBJ: Source Language ID: TB_CPLUSPLUS (0x9)
; OBJ32: CPU Version ID: TCPU_COM (0x3)
; OBJ64: CPU Version ID: TCPU_PPC64 (0x2)
; OBJ: Name: 1.cpp
3 changes: 2 additions & 1 deletion llvm/test/CodeGen/PowerPC/aix-filename-f.ll
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@

source_filename = "1.f95"

; OBJ: Name: 1.f95
; OBJ: Name: .file
; OBJ: Source Language ID: TB_Fortran (0x1)
; OBJ32: CPU Version ID: TCPU_COM (0x3)
; OBJ64: CPU Version ID: TCPU_PPC64 (0x2)
; OBJ: Name: 1.f95
14 changes: 12 additions & 2 deletions llvm/test/CodeGen/PowerPC/aix-func-dsc-gen.ll
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,23 @@ entry:
; CHECK-NEXT: AddressSize: 32bit
; CHECK: Symbol {
; CHECK-NEXT: Index: 0
; CHECK-NEXT: Name: <stdin>
; CHECK-NEXT: Name: .file
; CHECK-NEXT: Value (SymbolTableIndex): 0x0
; CHECK-NEXT: Section: N_DEBUG
; CHECK-NEXT: Source Language ID: TB_CPLUSPLUS (0x9)
; CHECK-NEXT: CPU Version ID: TCPU_COM (0x3)
; CHECK-NEXT: StorageClass: C_FILE (0x67)
; CHECK-NEXT: NumberOfAuxEntries: 0
; CHECK-NEXT: NumberOfAuxEntries: 2
; CHECK-NEXT: File Auxiliary Entry {
; CHECK-NEXT: Index: 1
; CHECK-NEXT: Name:
; CHECK-NEXT: Type: XFT_FN (0x0)
; CHECK-NEXT: }
; CHECK-NEXT: File Auxiliary Entry {
; CHECK-NEXT: Index: 2
; CHECK-NEXT: Name: LLVM
; CHECK-NEXT: Type: XFT_CV (0x2)
; CHECK-NEXT: }
; CHECK-NEXT: }
; CHECK-NEXT: Symbol {
; CHECK-NEXT: Index: [[#Index:]]
Expand Down
Loading