Skip to content

Commit 6e2d6b9

Browse files
author
Chen Zheng
committed
get symbol size by calling xcoff interfaces.
1 parent 0d0f219 commit 6e2d6b9

File tree

4 files changed

+42
-7
lines changed

4 files changed

+42
-7
lines changed

llvm/include/llvm/Object/XCOFFObjectFile.h

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
#include "llvm/ADT/SmallString.h"
1717
#include "llvm/ADT/SmallVector.h"
18+
#include "llvm/ADT/iterator_range.h"
1819
#include "llvm/BinaryFormat/XCOFF.h"
1920
#include "llvm/Object/ObjectFile.h"
2021
#include "llvm/Support/Endian.h"
@@ -23,6 +24,8 @@
2324
namespace llvm {
2425
namespace object {
2526

27+
class xcoff_symbol_iterator;
28+
2629
struct XCOFFFileHeader32 {
2730
support::ubig16_t Magic;
2831
support::ubig16_t NumberOfSections;
@@ -576,6 +579,10 @@ class XCOFFObjectFile : public ObjectFile {
576579
Expected<uint32_t> getSymbolFlags(DataRefImpl Symb) const override;
577580
basic_symbol_iterator symbol_begin() const override;
578581
basic_symbol_iterator symbol_end() const override;
582+
583+
using xcoff_symbol_iterator_range = iterator_range<xcoff_symbol_iterator>;
584+
xcoff_symbol_iterator_range symbols() const;
585+
579586
bool is64Bit() const override;
580587
Expected<StringRef> getSymbolName(DataRefImpl Symb) const override;
581588
Expected<uint64_t> getSymbolAddress(DataRefImpl Symb) const override;
@@ -761,7 +768,7 @@ struct XCOFFSymbolEntry64 {
761768
uint8_t NumberOfAuxEntries;
762769
};
763770

764-
class XCOFFSymbolRef {
771+
class XCOFFSymbolRef : public SymbolRef {
765772
public:
766773
enum { NAME_IN_STR_TBL_MAGIC = 0x0 };
767774

@@ -787,6 +794,11 @@ class XCOFFSymbolRef {
787794

788795
uint64_t getValue64() const { return Entry64->Value; }
789796

797+
uint64_t getSize() const {
798+
return cast<XCOFFObjectFile>(BasicSymbolRef::getObject())
799+
->getSymbolSize(getRawDataRefImpl());
800+
}
801+
790802
#define GETVALUE(X) Entry32 ? Entry32->X : Entry64->X
791803

792804
int16_t getSectionNumber() const { return GETVALUE(SectionNumber); }
@@ -827,6 +839,21 @@ class XCOFFSymbolRef {
827839
const XCOFFSymbolEntry64 *Entry64 = nullptr;
828840
};
829841

842+
class xcoff_symbol_iterator : public symbol_iterator {
843+
public:
844+
xcoff_symbol_iterator(const basic_symbol_iterator &B)
845+
: symbol_iterator(SymbolRef(B->getRawDataRefImpl(),
846+
cast<XCOFFObjectFile>(B->getObject()))) {}
847+
848+
const XCOFFSymbolRef *operator->() const {
849+
return static_cast<const XCOFFSymbolRef *>(symbol_iterator::operator->());
850+
}
851+
852+
const XCOFFSymbolRef &operator*() const {
853+
return static_cast<const XCOFFSymbolRef &>(symbol_iterator::operator*());
854+
}
855+
};
856+
830857
class TBVectorExt {
831858
uint16_t Data;
832859
SmallString<32> VecParmsInfo;

llvm/lib/Object/SymbolSize.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,13 @@ llvm::object::computeSymbolSizes(const ObjectFile &O) {
5959
return Ret;
6060
}
6161

62+
if (const auto *E = dyn_cast<XCOFFObjectFile>(&O)) {
63+
auto Syms = E->symbols();
64+
for (XCOFFSymbolRef Sym : Syms)
65+
Ret.push_back({Sym, Sym.getSize()});
66+
return Ret;
67+
}
68+
6269
// Collect sorted symbol addresses. Include dummy addresses for the end
6370
// of each section.
6471
std::vector<SymEntry> Addresses;

llvm/lib/Object/XCOFFObjectFile.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -689,6 +689,10 @@ basic_symbol_iterator XCOFFObjectFile::symbol_end() const {
689689
return basic_symbol_iterator(SymbolRef(SymDRI, this));
690690
}
691691

692+
XCOFFObjectFile::xcoff_symbol_iterator_range XCOFFObjectFile::symbols() const {
693+
return xcoff_symbol_iterator_range(symbol_begin(), symbol_end());
694+
}
695+
692696
section_iterator XCOFFObjectFile::section_begin() const {
693697
DataRefImpl DRI;
694698
DRI.p = getSectionHeaderTableAddress();

llvm/test/DebugInfo/Symbolize/XCOFF/xcoff-symbolize-data.ll

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,23 +35,20 @@
3535
; CHECK-EMPTY:
3636

3737
;; Test a function scope static variable.
38-
;; FIXME: fix the wrong size 152
3938
; CHECK: f()::function_global
40-
; CHECK-NEXT: 144 152
39+
; CHECK-NEXT: 144 4
4140
; CHECK-NEXT: /t.cpp:8
4241
; CHECK-EMPTY:
4342

4443
;; Test a global scope static variable that is used in current compilation unit.
45-
;; FIXME: fix the wrong size 152
4644
; CHECK: beta
47-
; CHECK-NEXT: 148 152
45+
; CHECK-NEXT: 148 4
4846
; CHECK-NEXT: /t.cpp:13
4947
; CHECK-EMPTY:
5048

5149
;; Test another global scope static variable that is used in current compilation unit.
52-
;; FIXME: fix the wrong size 152
5350
; CHECK: alpha
54-
; CHECK-NEXT: 152 152
51+
; CHECK-NEXT: 152 4
5552
; CHECK-NEXT: /t.cpp:12
5653
; CHECK-EMPTY:
5754

0 commit comments

Comments
 (0)