Revert "[llvm-readobj][XCOFF] dump auxiliary symbols."

This reverts commit aad49c8eb9.
Breaks tests on Windows, see comments on https://reviews.llvm.org/D113825
This commit is contained in:
Nico Weber 2022-01-12 09:42:05 -05:00
parent 9a1ce35d7e
commit d3b90f4104
6 changed files with 80 additions and 597 deletions

View File

@ -348,57 +348,6 @@ struct XCOFFSectAuxEntForStat {
uint8_t Pad[10];
}; // 32-bit XCOFF file only.
struct XCOFFFunctionAuxEnt32 {
support::ubig32_t OffsetToExceptionTbl;
support::ubig32_t SizeOfFunction;
support::ubig32_t PtrToLineNum;
support::big32_t SymIdxOfNextBeyond;
uint8_t Pad[2];
};
struct XCOFFFunctionAuxEnt64 {
support::ubig64_t PtrToLineNum;
support::ubig32_t SizeOfFunction;
support::big32_t SymIdxOfNextBeyond;
uint8_t Pad;
XCOFF::SymbolAuxType AuxType; // Contains _AUX_FCN; Type of auxiliary entry
};
struct XCOFFExceptionAuxEnt {
support::ubig64_t OffsetToExceptionTbl;
support::ubig32_t SizeOfFunction;
support::big32_t SymIdxOfNextBeyond;
uint8_t Pad;
XCOFF::SymbolAuxType AuxType; // Contains _AUX_EXCEPT; Type of auxiliary entry
};
struct XCOFFBlockAuxEnt32 {
uint8_t ReservedZeros1[2];
support::ubig16_t LineNumHi;
support::ubig16_t LineNumLo;
uint8_t ReservedZeros2[12];
};
struct XCOFFBlockAuxEnt64 {
support::ubig32_t LineNum;
uint8_t Pad[13];
XCOFF::SymbolAuxType AuxType; // Contains _AUX_SYM; Type of auxiliary entry
};
struct XCOFFSectAuxEntForDWARF32 {
support::ubig32_t LengthOfSectionPortion;
uint8_t Pad1[4];
support::ubig32_t NumberOfRelocEnt;
uint8_t Pad2[6];
};
struct XCOFFSectAuxEntForDWARF64 {
support::ubig64_t LengthOfSectionPortion;
support::ubig64_t NumberOfRelocEnt;
uint8_t Pad;
XCOFF::SymbolAuxType AuxType; // Contains _AUX_SECT; Type of Auxillary entry
};
template <typename AddressType> struct XCOFFRelocation {
// Masks for packing/unpacking the r_rsize field of relocations.

View File

@ -1112,12 +1112,8 @@ bool XCOFFSymbolRef::isFunction() const {
return true;
Expected<XCOFFCsectAuxRef> ExpCsectAuxEnt = getXCOFFCsectAuxRef();
if (!ExpCsectAuxEnt) {
// If we could not get the CSECT auxiliary entry, then treat this symbol as
// if it isn't a function. Consume the error and return `false` to move on.
consumeError(ExpCsectAuxEnt.takeError());
if (!ExpCsectAuxEnt)
return false;
}
const XCOFFCsectAuxRef CsectAuxRef = ExpCsectAuxEnt.get();

View File

@ -1,68 +1,23 @@
## Test that we report warnings or dump raw data when symbols are invalid.
# RUN: yaml2obj %s --docnum=1 -o %t1
# RUN: llvm-readobj --syms %t1 2>&1 | FileCheck %s -DFILE=%t1 --check-prefix=CASE1
# CASE1: llvm-readobj: warning: '[[FILE]]': the non-function C_EXT symbol at index 1 should have only 1 auxiliary entry, i.e. the CSECT auxiliary entry
--- !XCOFF
FileHeader:
MagicNumber: 0x1DF
Symbols:
- Name: .sym
- Name: .fun
StorageClass: [[STORAGECLASS='C_EXT']]
NumberOfAuxEntries: 2
# RUN: yaml2obj %s --docnum=1 -DSTORAGECLASS='C_WEAKEXT' -o %t2
# RUN: llvm-readobj --syms %t2 2>&1 | FileCheck %s -DFILE=%t2 --check-prefix=CASE2
# CASE2: llvm-readobj: warning: '[[FILE]]': the non-function C_WEAKEXT symbol at index 1 should have only 1 auxiliary entry, i.e. the CSECT auxiliary entry
# RUN: yaml2obj %s --docnum=1 -DSTORAGECLASS='C_HIDEXT' -o %t3
# RUN: llvm-readobj --syms %t3 2>&1 | FileCheck %s -DFILE=%t3 --check-prefix=CASE3
# CASE3: llvm-readobj: warning: '[[FILE]]': the non-function C_HIDEXT symbol at index 1 should have only 1 auxiliary entry, i.e. the CSECT auxiliary entry
# RUN: yaml2obj %s --docnum=1 -DSTORAGECLASS='C_STAT' -o %t4
# RUN: llvm-readobj --syms %t4 2>&1 | FileCheck %s -DFILE=%t4 --check-prefix=CASE4
# CASE4: llvm-readobj: warning: '[[FILE]]': the C_STAT symbol at index 1 should not have more than 1 auxiliary entry
# RUN: yaml2obj %s --docnum=1 -DSTORAGECLASS='C_DWARF' -o %t5
# RUN: llvm-readobj --syms %t5 2>&1 | FileCheck %s -DFILE=%t5 --check-prefix=CASE5
# CASE5: llvm-readobj: warning: '[[FILE]]': the C_DWARF symbol at index 1 should not have more than 1 auxiliary entry
# RUN: yaml2obj %s --docnum=1 -DSTORAGECLASS='C_BLOCK' -o %t6
# RUN: llvm-readobj --syms %t6 2>&1 | FileCheck %s -DFILE=%t6 --check-prefix=CASE6
# CASE6: llvm-readobj: warning: '[[FILE]]': the C_BLOCK symbol at index 1 should not have more than 1 auxiliary entry
# RUN: yaml2obj %s --docnum=1 -DSTORAGECLASS='C_FCN' -o %t7
# RUN: llvm-readobj --syms %t7 2>&1 | FileCheck %s -DFILE=%t7 --check-prefix=CASE7
# CASE7: llvm-readobj: warning: '[[FILE]]': the C_FCN symbol at index 1 should not have more than 1 auxiliary entry
## This case tests the raw data output ability when a file auxiliary entry does
## This file tests the raw data output ability when a file auxiliary entry does
## not have the matching auxiliary type.
# RUN: yaml2obj %s --docnum=2 -o %t8
# RUN: llvm-readobj --syms %t8 | FileCheck %s --strict-whitespace --match-full-lines --check-prefix=CASE8
# CASE8:Symbols [
# CASE8-NEXT: Symbol {
# CASE8-NEXT: Index: 0
# CASE8-NEXT: Name: .fun
# CASE8-NEXT: Value (SymbolTableIndex): 0x0
# CASE8-NEXT: Section: N_UNDEF
# CASE8-NEXT: Source Language ID: TB_C (0x0)
# CASE8-NEXT: CPU Version ID: 0x0
# CASE8-NEXT: StorageClass: C_FILE (0x67)
# CASE8-NEXT: NumberOfAuxEntries: 1
# CASE8-NEXT: !Unexpected raw auxiliary entry data:
# CASE8-NEXT: 00000000 00000001 00020300 00000000 00fb
# CASE8-NEXT: }
# CASE8-NEXT:]
# RUN: yaml2obj %s -o %t
# RUN: llvm-readobj --syms %t | FileCheck %s
# CHECK: Symbols [
# CHECK-NEXT: Symbol {
# CHECK-NEXT: Index: 0
# CHECK-NEXT: Name: .fun
# CHECK-NEXT: Value (SymbolTableIndex): 0x0
# CHECK-NEXT: Section: N_UNDEF
# CHECK-NEXT: Source Language ID: TB_C (0x0)
# CHECK-NEXT: CPU Version ID: 0x0
# CHECK-NEXT: StorageClass: C_FILE (0x67)
# CHECK-NEXT: NumberOfAuxEntries: 1
# CHECK-NEXT: !Unexpected raw auxiliary entry data:
# CHECK-NEXT: 00000000 00000001 00020300 00000000 00fb
# CHECK-NEXT: }
# CHECK-NEXT: ]
--- !XCOFF
FileHeader:

View File

@ -87,52 +87,6 @@ Symbols:
SectionOrLength: 256
StabInfoIndex: 2
StabSectNum: 3
## The C_WEAKEXT symbol with a Function auxiliary entry and a CSECT auxiliary entry.
- Name: .fun3
Value: 0x0
Section: N_DEBUG
Type: 0x20
StorageClass: C_WEAKEXT
NumberOfAuxEntries: 2
AuxEntries:
- Type: AUX_FCN
OffsetToExceptionTbl: 2
SizeOfFunction: 3
SymIdxOfNextBeyond: 4
PtrToLineNum: 5
- Type: AUX_CSECT
ParameterHashIndex: 11
TypeChkSectNum: 22
SymbolAlignmentAndType: 33
StorageMappingClass: XMC_PR
SectionOrLength: 256
StabInfoIndex: 44
StabSectNum: 55
## The C_DWARF symbol with a SECT auxiliary entry.
- Name: .fun4
Section: N_DEBUG
StorageClass: C_DWARF
NumberOfAuxEntries: 1
AuxEntries:
- Type: AUX_SECT
LengthOfSectionPortion: 2
NumberOfRelocEnt: 3
## The C_BLOCK symbol with a Block auxiliary entry.
- Name: .fun5
StorageClass: C_BLOCK
NumberOfAuxEntries: 1
AuxEntries:
- Type: AUX_SYM
LineNumHi: 2
LineNumLo: 3
## The C_FCN symbol with a Block auxiliary entry.
- Name: .fun6
StorageClass: C_FCN
NumberOfAuxEntries: 1
AuxEntries:
- Type: AUX_SYM
LineNumHi: 2
LineNumLo: 3
# SYMBOL32: Symbols [
# SYMBOL32-NEXT: Symbol {
@ -235,73 +189,4 @@ Symbols:
# SYMBOL32-NEXT: StabSectNum: 0x3
# SYMBOL32-NEXT: }
# SYMBOL32-NEXT: }
# SYMBOL32-NEXT: Symbol {
# SYMBOL32-NEXT: Index: 12
# SYMBOL32-NEXT: Name: .fun3
# SYMBOL32-NEXT: Value (RelocatableAddress): 0x0
# SYMBOL32-NEXT: Section: N_DEBUG
# SYMBOL32-NEXT: Type: 0x20
# SYMBOL32-NEXT: StorageClass: C_WEAKEXT (0x6F)
# SYMBOL32-NEXT: NumberOfAuxEntries: 2
# SYMBOL32-NEXT: Function Auxiliary Entry {
# SYMBOL32-NEXT: Index: 13
# SYMBOL32-NEXT: OffsetToExceptionTable: 0x2
# SYMBOL32-NEXT: SizeOfFunction: 0x3
# SYMBOL32-NEXT: PointerToLineNum: 0x5
# SYMBOL32-NEXT: SymbolIndexOfNextBeyond: 4
# SYMBOL32-NEXT: }
# SYMBOL32-NEXT: CSECT Auxiliary Entry {
# SYMBOL32-NEXT: Index: 14
# SYMBOL32-NEXT: SectionLen: 256
# SYMBOL32-NEXT: ParameterHashIndex: 0xB
# SYMBOL32-NEXT: TypeChkSectNum: 0x16
# SYMBOL32-NEXT: SymbolAlignmentLog2: 4
# SYMBOL32-NEXT: SymbolType: XTY_SD (0x1)
# SYMBOL32-NEXT: StorageMappingClass: XMC_PR (0x0)
# SYMBOL32-NEXT: StabInfoIndex: 0x2C
# SYMBOL32-NEXT: StabSectNum: 0x37
# SYMBOL32-NEXT: }
# SYMBOL32-NEXT: }
# SYMBOL32-NEXT: Symbol {
# SYMBOL32-NEXT: Index: 15
# SYMBOL32-NEXT: Name: .fun4
# SYMBOL32-NEXT: Value (OffsetInDWARF): 0x0
# SYMBOL32-NEXT: Section: N_DEBUG
# SYMBOL32-NEXT: Type: 0x0
# SYMBOL32-NEXT: StorageClass: C_DWARF (0x70)
# SYMBOL32-NEXT: NumberOfAuxEntries: 1
# SYMBOL32-NEXT: Sect Auxiliary Entry For DWARF {
# SYMBOL32-NEXT: Index: 16
# SYMBOL32-NEXT: LengthOfSectionPortion: 0x2
# SYMBOL32-NEXT: NumberOfRelocEntries: 3
# SYMBOL32-NEXT: }
# SYMBOL32-NEXT: }
# SYMBOL32-NEXT: Symbol {
# SYMBOL32-NEXT: Index: 17
# SYMBOL32-NEXT: Name: .fun5
# SYMBOL32-NEXT: Value (RelocatableAddress): 0x0
# SYMBOL32-NEXT: Section: N_UNDEF
# SYMBOL32-NEXT: Type: 0x0
# SYMBOL32-NEXT: StorageClass: C_BLOCK (0x64)
# SYMBOL32-NEXT: NumberOfAuxEntries: 1
# SYMBOL32-NEXT: Block Auxiliary Entry {
# SYMBOL32-NEXT: Index: 18
# SYMBOL32-NEXT: LineNumber (High 2 Bytes): 0x2
# SYMBOL32-NEXT: LineNumber (Low 2 Bytes): 0x3
# SYMBOL32-NEXT: }
# SYMBOL32-NEXT: }
# SYMBOL32-NEXT: Symbol {
# SYMBOL32-NEXT: Index: 19
# SYMBOL32-NEXT: Name: .fun6
# SYMBOL32-NEXT: Value (RelocatableAddress): 0x0
# SYMBOL32-NEXT: Section: N_UNDEF
# SYMBOL32-NEXT: Type: 0x0
# SYMBOL32-NEXT: StorageClass: C_FCN (0x65)
# SYMBOL32-NEXT: NumberOfAuxEntries: 1
# SYMBOL32-NEXT: Block Auxiliary Entry {
# SYMBOL32-NEXT: Index: 20
# SYMBOL32-NEXT: LineNumber (High 2 Bytes): 0x2
# SYMBOL32-NEXT: LineNumber (Low 2 Bytes): 0x3
# SYMBOL32-NEXT: }
# SYMBOL32-NEXT: }
# SYMBOL32-NEXT: ]

View File

@ -72,71 +72,6 @@ Symbols:
StorageMappingClass: XMC_PR
SectionOrLengthLo: 2
SectionOrLengthHi: 3
## The C_WEAKEXT symbol with a Function auxiliary entry and a CSECT auxiliary entry.
- Name: .fun3
Value: 0x0
Section: N_DEBUG
Type: 0x20
StorageClass: C_WEAKEXT
NumberOfAuxEntries: 2
AuxEntries:
- Type: AUX_FCN
SizeOfFunction: 3
SymIdxOfNextBeyond: 4
PtrToLineNum: 5
- Type: AUX_CSECT
ParameterHashIndex: 2
TypeChkSectNum: 3
SymbolAlignmentAndType: 1
StorageMappingClass: XMC_PR
SectionOrLengthLo: 4
SectionOrLengthHi: 5
## The C_EXT symbol with a Function auxiliary entry, a CSECT auxiliary entry, and an Exception auxiliary entry.
- Name: .fun4
Value: 0x0
Section: .text
Type: 0x20
StorageClass: C_EXT
NumberOfAuxEntries: 3
AuxEntries:
- Type: AUX_FCN
SizeOfFunction: 3
SymIdxOfNextBeyond: 4
PtrToLineNum: 5
- Type: AUX_EXCEPT
OffsetToExceptionTbl: 2
SizeOfFunction: 3
SymIdxOfNextBeyond: 4
- Type: AUX_CSECT
ParameterHashIndex: 2
TypeChkSectNum: 3
SymbolAlignmentAndType: 1
StorageMappingClass: XMC_PR
SectionOrLengthLo: 4
SectionOrLengthHi: 5
## The C_DWARF symbol with a SECT auxiliary entry.
- Name: .fun5
Section: N_DEBUG
StorageClass: C_DWARF
NumberOfAuxEntries: 1
AuxEntries:
- Type: AUX_SECT
LengthOfSectionPortion: 2
NumberOfRelocEnt: 3
## The C_BLOCK symbol with a Block auxiliary entry.
- Name: .fun6
StorageClass: C_BLOCK
NumberOfAuxEntries: 1
AuxEntries:
- Type: AUX_SYM
LineNum: 3
## The C_FCN symbol with a Block auxiliary entry.
- Name: .fun7
StorageClass: C_FCN
NumberOfAuxEntries: 1
AuxEntries:
- Type: AUX_SYM
LineNum: 3
# SYMBOL64: Symbols [
# SYMBOL64-NEXT: Symbol {
@ -224,106 +159,4 @@ Symbols:
# SYMBOL64-NEXT: Auxiliary Type: AUX_CSECT (0xFB)
# SYMBOL64-NEXT: }
# SYMBOL64-NEXT: }
# SYMBOL64-NEXT: Symbol {
# SYMBOL64-NEXT: Index: 10
# SYMBOL64-NEXT: Name: .fun3
# SYMBOL64-NEXT: Value (RelocatableAddress): 0x0
# SYMBOL64-NEXT: Section: N_DEBUG
# SYMBOL64-NEXT: Type: 0x20
# SYMBOL64-NEXT: StorageClass: C_WEAKEXT (0x6F)
# SYMBOL64-NEXT: NumberOfAuxEntries: 2
# SYMBOL64-NEXT: Function Auxiliary Entry {
# SYMBOL64-NEXT: Index: 11
# SYMBOL64-NEXT: SizeOfFunction: 0x3
# SYMBOL64-NEXT: PointerToLineNum: 0x5
# SYMBOL64-NEXT: SymbolIndexOfNextBeyond: 4
# SYMBOL64-NEXT: Auxiliary Type: AUX_FCN (0xFE)
# SYMBOL64-NEXT: }
# SYMBOL64-NEXT: CSECT Auxiliary Entry {
# SYMBOL64-NEXT: Index: 12
# SYMBOL64-NEXT: SectionLen: 21474836484
# SYMBOL64-NEXT: ParameterHashIndex: 0x2
# SYMBOL64-NEXT: TypeChkSectNum: 0x3
# SYMBOL64-NEXT: SymbolAlignmentLog2: 0
# SYMBOL64-NEXT: SymbolType: XTY_SD (0x1)
# SYMBOL64-NEXT: StorageMappingClass: XMC_PR (0x0)
# SYMBOL64-NEXT: Auxiliary Type: AUX_CSECT (0xFB)
# SYMBOL64-NEXT: }
# SYMBOL64-NEXT: }
# SYMBOL64-NEXT: Symbol {
# SYMBOL64-NEXT: Index: 13
# SYMBOL64-NEXT: Name: .fun4
# SYMBOL64-NEXT: Value (RelocatableAddress): 0x0
# SYMBOL64-NEXT: Section: .text
# SYMBOL64-NEXT: Type: 0x20
# SYMBOL64-NEXT: StorageClass: C_EXT (0x2)
# SYMBOL64-NEXT: NumberOfAuxEntries: 3
# SYMBOL64-NEXT: Function Auxiliary Entry {
# SYMBOL64-NEXT: Index: 14
# SYMBOL64-NEXT: SizeOfFunction: 0x3
# SYMBOL64-NEXT: PointerToLineNum: 0x5
# SYMBOL64-NEXT: SymbolIndexOfNextBeyond: 4
# SYMBOL64-NEXT: Auxiliary Type: AUX_FCN (0xFE)
# SYMBOL64-NEXT: }
# SYMBOL64-NEXT: Exception Auxiliary Entry {
# SYMBOL64-NEXT: Index: 15
# SYMBOL64-NEXT: OffsetToExceptionTable: 0x2
# SYMBOL64-NEXT: SizeOfFunction: 0x3
# SYMBOL64-NEXT: SymbolIndexOfNextBeyond: 4
# SYMBOL64-NEXT: Auxiliary Type: AUX_EXCEPT (0xFF)
# SYMBOL64-NEXT: }
# SYMBOL64-NEXT: CSECT Auxiliary Entry {
# SYMBOL64-NEXT: Index: 16
# SYMBOL64-NEXT: SectionLen: 21474836484
# SYMBOL64-NEXT: ParameterHashIndex: 0x2
# SYMBOL64-NEXT: TypeChkSectNum: 0x3
# SYMBOL64-NEXT: SymbolAlignmentLog2: 0
# SYMBOL64-NEXT: SymbolType: XTY_SD (0x1)
# SYMBOL64-NEXT: StorageMappingClass: XMC_PR (0x0)
# SYMBOL64-NEXT: Auxiliary Type: AUX_CSECT (0xFB)
# SYMBOL64-NEXT: }
# SYMBOL64-NEXT: }
# SYMBOL64-NEXT: Symbol {
# SYMBOL64-NEXT: Index: 17
# SYMBOL64-NEXT: Name: .fun5
# SYMBOL64-NEXT: Value (OffsetInDWARF): 0x0
# SYMBOL64-NEXT: Section: N_DEBUG
# SYMBOL64-NEXT: Type: 0x0
# SYMBOL64-NEXT: StorageClass: C_DWARF (0x70)
# SYMBOL64-NEXT: NumberOfAuxEntries: 1
# SYMBOL64-NEXT: Sect Auxiliary Entry For DWARF {
# SYMBOL64-NEXT: Index: 18
# SYMBOL64-NEXT: LengthOfSectionPortion: 0x2
# SYMBOL64-NEXT: NumberOfRelocEntries: 3
# SYMBOL64-NEXT: Auxiliary Type: AUX_SECT (0xFA)
# SYMBOL64-NEXT: }
# SYMBOL64-NEXT: }
# SYMBOL64-NEXT: Symbol {
# SYMBOL64-NEXT: Index: 19
# SYMBOL64-NEXT: Name: .fun6
# SYMBOL64-NEXT: Value (RelocatableAddress): 0x0
# SYMBOL64-NEXT: Section: N_UNDEF
# SYMBOL64-NEXT: Type: 0x0
# SYMBOL64-NEXT: StorageClass: C_BLOCK (0x64)
# SYMBOL64-NEXT: NumberOfAuxEntries: 1
# SYMBOL64-NEXT: Block Auxiliary Entry {
# SYMBOL64-NEXT: Index: 20
# SYMBOL64-NEXT: LineNumber: 0x3
# SYMBOL64-NEXT: Auxiliary Type: AUX_SYM (0xFD)
# SYMBOL64-NEXT: }
# SYMBOL64-NEXT: }
# SYMBOL64-NEXT: Symbol {
# SYMBOL64-NEXT: Index: 21
# SYMBOL64-NEXT: Name: .fun7
# SYMBOL64-NEXT: Value (RelocatableAddress): 0x0
# SYMBOL64-NEXT: Section: N_UNDEF
# SYMBOL64-NEXT: Type: 0x0
# SYMBOL64-NEXT: StorageClass: C_FCN (0x65)
# SYMBOL64-NEXT: NumberOfAuxEntries: 1
# SYMBOL64-NEXT: Block Auxiliary Entry {
# SYMBOL64-NEXT: Index: 22
# SYMBOL64-NEXT: LineNumber: 0x3
# SYMBOL64-NEXT: Auxiliary Type: AUX_SYM (0xFD)
# SYMBOL64-NEXT: }
# SYMBOL64-NEXT: }
# SYMBOL64-NEXT: ]

View File

@ -44,16 +44,9 @@ private:
template <typename T> void printSectionHeaders(ArrayRef<T> Sections);
template <typename T> void printGenericSectionHeader(T &Sec) const;
template <typename T> void printOverflowSectionHeader(T &Sec) const;
template <typename T> const T *getAuxEntPtr(uintptr_t AuxAddress);
void printFileAuxEnt(const XCOFFFileAuxEnt *AuxEntPtr);
void printCsectAuxEnt(XCOFFCsectAuxRef AuxEntRef);
void printSectAuxEntForStat(const XCOFFSectAuxEntForStat *AuxEntPtr);
void printExceptionAuxEnt(const XCOFFExceptionAuxEnt *AuxEntPtr);
void printFunctionAuxEnt(const XCOFFFunctionAuxEnt32 *AuxEntPtr);
void printFunctionAuxEnt(const XCOFFFunctionAuxEnt64 *AuxEntPtr);
void printBlockAuxEnt(const XCOFFBlockAuxEnt32 *AuxEntPtr);
void printBlockAuxEnt(const XCOFFBlockAuxEnt64 *AuxEntPtr);
template <typename T> void printSectAuxEntForDWARF(const T *AuxEntPtr);
void printSymbol(const SymbolRef &);
template <typename RelTy> void printRelocation(RelTy Reloc);
template <typename Shdr, typename RelTy>
@ -296,77 +289,6 @@ void XCOFFDumper::printSectAuxEntForStat(
W.printNumber("NumberOfLineNum", AuxEntPtr->NumberOfLineNum);
}
void XCOFFDumper::printExceptionAuxEnt(const XCOFFExceptionAuxEnt *AuxEntPtr) {
assert(Obj.is64Bit() && "64-bit interface called on 32-bit object file.");
DictScope SymDs(W, "Exception Auxiliary Entry");
W.printNumber("Index",
Obj.getSymbolIndex(reinterpret_cast<uintptr_t>(AuxEntPtr)));
W.printHex("OffsetToExceptionTable", AuxEntPtr->OffsetToExceptionTbl);
W.printHex("SizeOfFunction", AuxEntPtr->SizeOfFunction);
W.printNumber("SymbolIndexOfNextBeyond", AuxEntPtr->SymIdxOfNextBeyond);
W.printEnum("Auxiliary Type", static_cast<uint8_t>(AuxEntPtr->AuxType),
makeArrayRef(SymAuxType));
}
void XCOFFDumper::printFunctionAuxEnt(const XCOFFFunctionAuxEnt32 *AuxEntPtr) {
assert(!Obj.is64Bit() && "32-bit interface called on 64-bit object file.");
DictScope SymDs(W, "Function Auxiliary Entry");
W.printNumber("Index",
Obj.getSymbolIndex(reinterpret_cast<uintptr_t>(AuxEntPtr)));
W.printHex("OffsetToExceptionTable", AuxEntPtr->OffsetToExceptionTbl);
W.printHex("SizeOfFunction", AuxEntPtr->SizeOfFunction);
W.printHex("PointerToLineNum", AuxEntPtr->PtrToLineNum);
W.printNumber("SymbolIndexOfNextBeyond", AuxEntPtr->SymIdxOfNextBeyond);
}
void XCOFFDumper::printFunctionAuxEnt(const XCOFFFunctionAuxEnt64 *AuxEntPtr) {
assert(Obj.is64Bit() && "64-bit interface called on 32-bit object file.");
DictScope SymDs(W, "Function Auxiliary Entry");
W.printNumber("Index",
Obj.getSymbolIndex(reinterpret_cast<uintptr_t>(AuxEntPtr)));
W.printHex("SizeOfFunction", AuxEntPtr->SizeOfFunction);
W.printHex("PointerToLineNum", AuxEntPtr->PtrToLineNum);
W.printNumber("SymbolIndexOfNextBeyond", AuxEntPtr->SymIdxOfNextBeyond);
W.printEnum("Auxiliary Type", static_cast<uint8_t>(AuxEntPtr->AuxType),
makeArrayRef(SymAuxType));
}
void XCOFFDumper::printBlockAuxEnt(const XCOFFBlockAuxEnt32 *AuxEntPtr) {
assert(!Obj.is64Bit() && "32-bit interface called on 64-bit object file.");
DictScope SymDs(W, "Block Auxiliary Entry");
W.printNumber("Index",
Obj.getSymbolIndex(reinterpret_cast<uintptr_t>(AuxEntPtr)));
W.printHex("LineNumber (High 2 Bytes)", AuxEntPtr->LineNumHi);
W.printHex("LineNumber (Low 2 Bytes)", AuxEntPtr->LineNumLo);
}
void XCOFFDumper::printBlockAuxEnt(const XCOFFBlockAuxEnt64 *AuxEntPtr) {
assert(Obj.is64Bit() && "64-bit interface called on 32-bit object file.");
DictScope SymDs(W, "Block Auxiliary Entry");
W.printNumber("Index",
Obj.getSymbolIndex(reinterpret_cast<uintptr_t>(AuxEntPtr)));
W.printHex("LineNumber", AuxEntPtr->LineNum);
W.printEnum("Auxiliary Type", static_cast<uint8_t>(AuxEntPtr->AuxType),
makeArrayRef(SymAuxType));
}
template <typename T>
void XCOFFDumper::printSectAuxEntForDWARF(const T *AuxEntPtr) {
DictScope SymDs(W, "Sect Auxiliary Entry For DWARF");
W.printNumber("Index",
Obj.getSymbolIndex(reinterpret_cast<uintptr_t>(AuxEntPtr)));
W.printHex("LengthOfSectionPortion", AuxEntPtr->LengthOfSectionPortion);
W.printNumber("NumberOfRelocEntries", AuxEntPtr->NumberOfRelocEnt);
if (Obj.is64Bit())
W.printEnum("Auxiliary Type", static_cast<uint8_t>(XCOFF::AUX_SECT),
makeArrayRef(SymAuxType));
}
const EnumEntry<XCOFF::StorageClass> SymStorageClass[] = {
#define ECase(X) \
{ #X, XCOFF::X }
@ -392,13 +314,11 @@ static StringRef GetSymbolValueName(XCOFF::StorageClass SC) {
case XCOFF::C_WEAKEXT:
case XCOFF::C_HIDEXT:
case XCOFF::C_STAT:
case XCOFF::C_FCN:
case XCOFF::C_BLOCK:
return "Value (RelocatableAddress)";
case XCOFF::C_FILE:
return "Value (SymbolTableIndex)";
case XCOFF::C_DWARF:
return "Value (OffsetInDWARF)";
case XCOFF::C_FCN:
case XCOFF::C_BLOCK:
case XCOFF::C_FUN:
case XCOFF::C_STSYM:
case XCOFF::C_BINCL:
@ -410,6 +330,7 @@ static StringRef GetSymbolValueName(XCOFF::StorageClass SC) {
case XCOFF::C_RPSYM:
case XCOFF::C_RSYM:
case XCOFF::C_ECOML:
case XCOFF::C_DWARF:
assert(false && "This StorageClass for the symbol is not yet implemented.");
return "";
default:
@ -431,22 +352,6 @@ const EnumEntry<XCOFF::CFileCpuId> CFileCpuIdClass[] = {
#undef ECase
};
template <typename T> const T *XCOFFDumper::getAuxEntPtr(uintptr_t AuxAddress) {
const T *AuxEntPtr = reinterpret_cast<const T *>(AuxAddress);
Obj.checkSymbolEntryPointer(reinterpret_cast<uintptr_t>(AuxEntPtr));
return AuxEntPtr;
}
static void printUnexpectedRawAuxEnt(ScopedPrinter &W, uintptr_t AuxAddress) {
W.startLine() << "!Unexpected raw auxiliary entry data:\n";
W.startLine() << format_bytes(
ArrayRef<uint8_t>(
reinterpret_cast<const uint8_t *>(AuxAddress),
XCOFF::SymbolTableEntrySize),
None, XCOFF::SymbolTableEntrySize)
<< "\n";
}
void XCOFFDumper::printSymbol(const SymbolRef &S) {
DataRefImpl SymbolDRI = S.getRawDataRefImpl();
XCOFFSymbolRef SymbolEntRef = Obj.toSymbolRef(SymbolDRI);
@ -458,18 +363,16 @@ void XCOFFDumper::printSymbol(const SymbolRef &S) {
StringRef SymbolName =
unwrapOrError(Obj.getFileName(), SymbolEntRef.getName());
uint32_t SymbolIdx = Obj.getSymbolIndex(SymbolEntRef.getEntryAddress());
XCOFF::StorageClass SymbolClass = SymbolEntRef.getStorageClass();
W.printNumber("Index", SymbolIdx);
W.printNumber("Index", Obj.getSymbolIndex(SymbolEntRef.getEntryAddress()));
W.printString("Name", SymbolName);
W.printHex(GetSymbolValueName(SymbolClass), SymbolEntRef.getValue());
W.printHex(GetSymbolValueName(SymbolEntRef.getStorageClass()),
SymbolEntRef.getValue());
StringRef SectionName =
unwrapOrError(Obj.getFileName(), Obj.getSymbolSectionName(SymbolEntRef));
W.printString("Section", SectionName);
if (SymbolClass == XCOFF::C_FILE) {
if (SymbolEntRef.getStorageClass() == XCOFF::C_FILE) {
W.printEnum("Source Language ID", SymbolEntRef.getLanguageIdForCFile(),
makeArrayRef(CFileLangIdClass));
W.printEnum("CPU Version ID", SymbolEntRef.getCPUTypeIddForCFile(),
@ -477,24 +380,15 @@ void XCOFFDumper::printSymbol(const SymbolRef &S) {
} else
W.printHex("Type", SymbolEntRef.getSymbolType());
W.printEnum("StorageClass", static_cast<uint8_t>(SymbolClass),
W.printEnum("StorageClass",
static_cast<uint8_t>(SymbolEntRef.getStorageClass()),
makeArrayRef(SymStorageClass));
W.printNumber("NumberOfAuxEntries", NumberOfAuxEntries);
if (NumberOfAuxEntries == 0)
return;
auto checkNumOfAux = [=] {
if (NumberOfAuxEntries > 1)
reportUniqueWarning("the " +
enumToString(static_cast<uint8_t>(SymbolClass),
makeArrayRef(SymStorageClass)) +
" symbol at index " + Twine(SymbolIdx) +
" should not have more than 1 "
"auxiliary entry");
};
switch (SymbolClass) {
switch (SymbolEntRef.getStorageClass()) {
case XCOFF::C_FILE:
// If the symbol is C_FILE and has auxiliary entries...
for (int I = 1; I <= NumberOfAuxEntries; I++) {
@ -503,62 +397,55 @@ void XCOFFDumper::printSymbol(const SymbolRef &S) {
if (Obj.is64Bit() &&
*Obj.getSymbolAuxType(AuxAddress) != XCOFF::SymbolAuxType::AUX_FILE) {
printUnexpectedRawAuxEnt(W, AuxAddress);
W.startLine() << "!Unexpected raw auxiliary entry data:\n";
W.startLine() << format_bytes(
ArrayRef<uint8_t>(
reinterpret_cast<const uint8_t *>(AuxAddress),
XCOFF::SymbolTableEntrySize),
0, XCOFF::SymbolTableEntrySize)
<< "\n";
continue;
}
const XCOFFFileAuxEnt *FileAuxEntPtr =
getAuxEntPtr<XCOFFFileAuxEnt>(AuxAddress);
reinterpret_cast<const XCOFFFileAuxEnt *>(AuxAddress);
#ifndef NDEBUG
Obj.checkSymbolEntryPointer(reinterpret_cast<uintptr_t>(FileAuxEntPtr));
#endif
printFileAuxEnt(FileAuxEntPtr);
}
break;
case XCOFF::C_EXT:
case XCOFF::C_WEAKEXT:
case XCOFF::C_HIDEXT: {
if (!SymbolEntRef.isFunction() && NumberOfAuxEntries > 1)
reportUniqueWarning("the non-function " +
enumToString(static_cast<uint8_t>(SymbolClass),
makeArrayRef(SymStorageClass)) +
" symbol at index " + Twine(SymbolIdx) +
" should have only 1 auxiliary entry, i.e. the CSECT "
"auxiliary entry");
// If the symbol is for a function, and it has more than 1 auxiliary entry,
// then one of them must be function auxiliary entry which we do not
// support yet.
if (SymbolEntRef.isFunction() && NumberOfAuxEntries >= 2)
report_fatal_error("Function auxiliary entry printing is unimplemented.");
// For 32-bit objects, print the function auxiliary symbol table entry. The
// last one must be a CSECT auxiliary entry.
// For 64-bit objects, both a function auxiliary entry and an exception
// auxiliary entry may appear, print them in the loop and skip printing the
// CSECT auxiliary entry, which will be printed outside the loop.
// If there is more than 1 auxiliary entry, instead of printing out
// error information, print out the raw Auxiliary entry.
// For 32-bit object, print from first to the last - 1. The last one must be
// a CSECT Auxiliary Entry.
// For 64-bit object, print from first to last and skips if SymbolAuxType is
// AUX_CSECT.
for (int I = 1; I <= NumberOfAuxEntries; I++) {
if ((I == NumberOfAuxEntries && !Obj.is64Bit()) ||
!SymbolEntRef.isFunction())
if (I == NumberOfAuxEntries && !Obj.is64Bit())
break;
uintptr_t AuxAddress = XCOFFObjectFile::getAdvancedSymbolEntryAddress(
SymbolEntRef.getEntryAddress(), I);
if (Obj.is64Bit() &&
*Obj.getSymbolAuxType(AuxAddress) == XCOFF::SymbolAuxType::AUX_CSECT)
continue;
if (Obj.is64Bit()) {
XCOFF::SymbolAuxType Type = *Obj.getSymbolAuxType(AuxAddress);
if (Type == XCOFF::SymbolAuxType::AUX_CSECT)
continue;
if (Type == XCOFF::SymbolAuxType::AUX_FCN) {
const XCOFFFunctionAuxEnt64 *AuxEntPtr =
getAuxEntPtr<XCOFFFunctionAuxEnt64>(AuxAddress);
printFunctionAuxEnt(AuxEntPtr);
} else if (Type == XCOFF::SymbolAuxType::AUX_EXCEPT) {
const XCOFFExceptionAuxEnt *AuxEntPtr =
getAuxEntPtr<XCOFFExceptionAuxEnt>(AuxAddress);
printExceptionAuxEnt(AuxEntPtr);
} else {
printUnexpectedRawAuxEnt(W, AuxAddress);
}
} else {
const XCOFFFunctionAuxEnt32 *AuxEntPtr =
getAuxEntPtr<XCOFFFunctionAuxEnt32>(AuxAddress);
printFunctionAuxEnt(AuxEntPtr);
}
W.startLine() << "!Unexpected raw auxiliary entry data:\n";
W.startLine() << format_bytes(
ArrayRef<uint8_t>(reinterpret_cast<const uint8_t *>(AuxAddress),
XCOFF::SymbolTableEntrySize));
}
// Print the CSECT auxiliary entry.
auto ErrOrCsectAuxRef = SymbolEntRef.getXCOFFCsectAuxRef();
if (!ErrOrCsectAuxRef)
reportUniqueWarning(ErrOrCsectAuxRef.takeError());
@ -567,56 +454,34 @@ void XCOFFDumper::printSymbol(const SymbolRef &S) {
break;
}
case XCOFF::C_STAT: {
checkNumOfAux();
case XCOFF::C_STAT:
if (NumberOfAuxEntries > 1)
report_fatal_error(
"C_STAT symbol should not have more than 1 auxiliary entry.");
const XCOFFSectAuxEntForStat *StatAuxEntPtr =
getAuxEntPtr<XCOFFSectAuxEntForStat>(
XCOFFObjectFile::getAdvancedSymbolEntryAddress(
SymbolEntRef.getEntryAddress(), 1));
const XCOFFSectAuxEntForStat *StatAuxEntPtr;
StatAuxEntPtr = reinterpret_cast<const XCOFFSectAuxEntForStat *>(
XCOFFObjectFile::getAdvancedSymbolEntryAddress(
SymbolEntRef.getEntryAddress(), 1));
#ifndef NDEBUG
Obj.checkSymbolEntryPointer(reinterpret_cast<uintptr_t>(StatAuxEntPtr));
#endif
printSectAuxEntForStat(StatAuxEntPtr);
break;
}
case XCOFF::C_DWARF: {
checkNumOfAux();
uintptr_t AuxAddress = XCOFFObjectFile::getAdvancedSymbolEntryAddress(
SymbolEntRef.getEntryAddress(), 1);
if (Obj.is64Bit()) {
const XCOFFSectAuxEntForDWARF64 *AuxEntPtr =
getAuxEntPtr<XCOFFSectAuxEntForDWARF64>(AuxAddress);
printSectAuxEntForDWARF<XCOFFSectAuxEntForDWARF64>(AuxEntPtr);
} else {
const XCOFFSectAuxEntForDWARF32 *AuxEntPtr =
getAuxEntPtr<XCOFFSectAuxEntForDWARF32>(AuxAddress);
printSectAuxEntForDWARF<XCOFFSectAuxEntForDWARF32>(AuxEntPtr);
}
break;
}
case XCOFF::C_DWARF:
case XCOFF::C_BLOCK:
case XCOFF::C_FCN: {
checkNumOfAux();
uintptr_t AuxAddress = XCOFFObjectFile::getAdvancedSymbolEntryAddress(
SymbolEntRef.getEntryAddress(), 1);
if (Obj.is64Bit()) {
const XCOFFBlockAuxEnt64 *AuxEntPtr =
getAuxEntPtr<XCOFFBlockAuxEnt64>(AuxAddress);
printBlockAuxEnt(AuxEntPtr);
} else {
const XCOFFBlockAuxEnt32 *AuxEntPtr =
getAuxEntPtr<XCOFFBlockAuxEnt32>(AuxAddress);
printBlockAuxEnt(AuxEntPtr);
}
case XCOFF::C_FCN:
report_fatal_error("Symbol table entry printing for this storage class "
"type is unimplemented.");
break;
}
default:
for (int i = 1; i <= NumberOfAuxEntries; i++) {
printUnexpectedRawAuxEnt(W,
XCOFFObjectFile::getAdvancedSymbolEntryAddress(
SymbolEntRef.getEntryAddress(), i));
W.startLine() << "!Unexpected raw auxiliary entry data:\n";
W.startLine() << format_bytes(
ArrayRef<uint8_t>(reinterpret_cast<const uint8_t *>(
XCOFFObjectFile::getAdvancedSymbolEntryAddress(
SymbolEntRef.getEntryAddress(), i)),
XCOFF::SymbolTableEntrySize));
}
break;
}