summaryrefslogtreecommitdiffstats
path: root/llvm/tools
diff options
context:
space:
mode:
authorJason Liu <jasonliu.development@gmail.com>2019-05-28 14:37:59 +0000
committerJason Liu <jasonliu.development@gmail.com>2019-05-28 14:37:59 +0000
commit9212206d253b858d761cbad8a71ec71189d6b588 (patch)
treee4a98f9e861e834f11b8d7fb54d43401a863b18c /llvm/tools
parent71f8f745b412500c6a9207c56f55fa2d6e8114b1 (diff)
downloadbcm5719-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.cpp2
-rw-r--r--llvm/tools/obj2yaml/xcoff2yaml.cpp45
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();
OpenPOWER on IntegriCloud