Skip to content

[XCOFF] Add compiler version to an auxiliary symbol table entry #80162

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Feb 6, 2024
Merged
Show file tree
Hide file tree
Changes from all 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 (!CompilerVersion.empty()) {
PrintQuotedString(CompilerVersion, OS);
}
if (!TimeStamp.empty()) {
OS << ",";
PrintQuotedString(TimeStamp, OS);
}
if (!Description.empty()) {
bool useTimeStamp = !TimeStamp.empty();
bool useCompilerVersion = !CompilerVersion.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(CompilerVersion, 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 @@ -640,12 +643,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 @@ -818,7 +829,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 @@ -878,6 +889,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 @@ -1109,8 +1150,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 @@ -1139,9 +1183,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 @@ -1357,9 +1407,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