diff options
author | Jason Liu <jasonliu.development@gmail.com> | 2019-05-28 14:37:59 +0000 |
---|---|---|
committer | Jason Liu <jasonliu.development@gmail.com> | 2019-05-28 14:37:59 +0000 |
commit | 9212206d253b858d761cbad8a71ec71189d6b588 (patch) | |
tree | e4a98f9e861e834f11b8d7fb54d43401a863b18c /llvm/tools | |
parent | 71f8f745b412500c6a9207c56f55fa2d6e8114b1 (diff) | |
download | bcm5719-llvm-9212206d253b858d761cbad8a71ec71189d6b588.tar.gz bcm5719-llvm-9212206d253b858d761cbad8a71ec71189d6b588.zip |
[XCOFF] Implement parsing symbol table for xcoffobjfile and output as yaml format
Summary:
This patch implement parsing symbol table for xcoffobjfile and
output as yaml format. Parsing auxiliary entries of a symbol
will be in a separate patch.
The XCOFF object file (aix_xcoff.o) used in the test comes from
-bash-4.2$ cat test.c
extern int i;
extern int TestforXcoff;
int main()
{
i++;
TestforXcoff--;
}
Patch by DiggerLin
Reviewers: sfertile, hubert.reinterpretcast, MaskRay, daltenty
Differential Revision: https://reviews.llvm.org/D61532
llvm-svn: 361832
Diffstat (limited to 'llvm/tools')
-rw-r--r-- | llvm/tools/llvm-readobj/XCOFFDumper.cpp | 2 | ||||
-rw-r--r-- | llvm/tools/obj2yaml/xcoff2yaml.cpp | 45 |
2 files changed, 44 insertions, 3 deletions
diff --git a/llvm/tools/llvm-readobj/XCOFFDumper.cpp b/llvm/tools/llvm-readobj/XCOFFDumper.cpp index 009b99c1f7b..59293fe80ee 100644 --- a/llvm/tools/llvm-readobj/XCOFFDumper.cpp +++ b/llvm/tools/llvm-readobj/XCOFFDumper.cpp @@ -66,7 +66,7 @@ void XCOFFDumper::printFileHeaders() { } W.printHex("SymbolTableOffset", Obj.getSymbolTableOffset()); - int32_t SymTabEntries = Obj.getNumberOfSymbolTableEntries(); + int32_t SymTabEntries = Obj.getRawNumberOfSymbolTableEntries(); if (SymTabEntries >= 0) W.printNumber("SymbolTableEntries", SymTabEntries); else diff --git a/llvm/tools/obj2yaml/xcoff2yaml.cpp b/llvm/tools/obj2yaml/xcoff2yaml.cpp index 5ee9eafbcbe..bcacd2b8d55 100644 --- a/llvm/tools/obj2yaml/xcoff2yaml.cpp +++ b/llvm/tools/obj2yaml/xcoff2yaml.cpp @@ -19,15 +19,20 @@ class XCOFFDumper { const object::XCOFFObjectFile &Obj; XCOFFYAML::Object YAMLObj; void dumpHeader(); + std::error_code dumpSymbols(); public: - XCOFFDumper(const object::XCOFFObjectFile &obj); + XCOFFDumper(const object::XCOFFObjectFile &obj) : Obj(obj) {} + std::error_code dump(); XCOFFYAML::Object &getYAMLObj() { return YAMLObj; } }; } // namespace -XCOFFDumper::XCOFFDumper(const object::XCOFFObjectFile &obj) : Obj(obj) { +std::error_code XCOFFDumper::dump() { + std::error_code EC; dumpHeader(); + EC = dumpSymbols(); + return EC; } void XCOFFDumper::dumpHeader() { @@ -42,9 +47,45 @@ void XCOFFDumper::dumpHeader() { YAMLObj.Header.Flags = FileHdrPtr->Flags; } +std::error_code XCOFFDumper::dumpSymbols() { + std::vector<XCOFFYAML::Symbol> &Symbols = YAMLObj.Symbols; + + for (const SymbolRef &S : Obj.symbols()) { + DataRefImpl SymbolDRI = S.getRawDataRefImpl(); + const XCOFFSymbolEntry *SymbolEntPtr = Obj.toSymbolEntry(SymbolDRI); + XCOFFYAML::Symbol Sym; + + Expected<StringRef> SymNameRefOrErr = Obj.getSymbolName(SymbolDRI); + if (!SymNameRefOrErr) { + return errorToErrorCode(SymNameRefOrErr.takeError()); + } + Sym.SymbolName = SymNameRefOrErr.get(); + + Sym.Value = SymbolEntPtr->Value; + + Expected<StringRef> SectionNameRefOrErr = + Obj.getSymbolSectionName(SymbolEntPtr); + if (!SectionNameRefOrErr) + return errorToErrorCode(SectionNameRefOrErr.takeError()); + + Sym.SectionName = SectionNameRefOrErr.get(); + + Sym.Type = SymbolEntPtr->SymbolType; + Sym.StorageClass = SymbolEntPtr->StorageClass; + Sym.NumberOfAuxEntries = SymbolEntPtr->NumberOfAuxEntries; + Symbols.push_back(Sym); + } + + return std::error_code(); +} + std::error_code xcoff2yaml(raw_ostream &Out, const object::XCOFFObjectFile &Obj) { XCOFFDumper Dumper(Obj); + + if (std::error_code EC = Dumper.dump()) + return EC; + yaml::Output Yout(Out); Yout << Dumper.getYAMLObj(); |