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/lib/ObjectYAML | |
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/lib/ObjectYAML')
-rw-r--r-- | llvm/lib/ObjectYAML/XCOFFYAML.cpp | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/llvm/lib/ObjectYAML/XCOFFYAML.cpp b/llvm/lib/ObjectYAML/XCOFFYAML.cpp index c3fe1bb868c..982e6aecbb9 100644 --- a/llvm/lib/ObjectYAML/XCOFFYAML.cpp +++ b/llvm/lib/ObjectYAML/XCOFFYAML.cpp @@ -11,6 +11,7 @@ //===----------------------------------------------------------------------===// #include "llvm/ObjectYAML/XCOFFYAML.h" +#include "llvm/BinaryFormat/XCOFF.h" #include <string.h> namespace llvm { @@ -22,6 +23,62 @@ Object::Object() { memset(&Header, 0, sizeof(Header)); } namespace yaml { +void ScalarEnumerationTraits<XCOFF::StorageClass>::enumeration( + IO &IO, XCOFF::StorageClass &Value) { +#define ECase(X) IO.enumCase(Value, #X, XCOFF::X) + ECase(C_NULL); + ECase(C_AUTO); + ECase(C_EXT); + ECase(C_STAT); + ECase(C_REG); + ECase(C_EXTDEF); + ECase(C_LABEL); + ECase(C_ULABEL); + ECase(C_MOS); + ECase(C_ARG); + ECase(C_STRTAG); + ECase(C_MOU); + ECase(C_UNTAG); + ECase(C_TPDEF); + ECase(C_USTATIC); + ECase(C_ENTAG); + ECase(C_MOE); + ECase(C_REGPARM); + ECase(C_FIELD); + ECase(C_BLOCK); + ECase(C_FCN); + ECase(C_EOS); + ECase(C_FILE); + ECase(C_LINE); + ECase(C_ALIAS); + ECase(C_HIDDEN); + ECase(C_HIDEXT); + ECase(C_BINCL); + ECase(C_EINCL); + ECase(C_INFO); + ECase(C_WEAKEXT); + ECase(C_DWARF); + ECase(C_GSYM); + ECase(C_LSYM); + ECase(C_PSYM); + ECase(C_RSYM); + ECase(C_RPSYM); + ECase(C_STSYM); + ECase(C_TCSYM); + ECase(C_BCOMM); + ECase(C_ECOML); + ECase(C_ECOMM); + ECase(C_DECL); + ECase(C_ENTRY); + ECase(C_FUN); + ECase(C_BSTAT); + ECase(C_ESTAT); + ECase(C_GTLS); + ECase(C_STTLS); + ECase(C_EFCN); +#undef ECase +} + void MappingTraits<XCOFFYAML::FileHeader>::mapping( IO &IO, XCOFFYAML::FileHeader &FileHdr) { IO.mapRequired("MagicNumber", FileHdr.Magic); @@ -33,9 +90,19 @@ void MappingTraits<XCOFFYAML::FileHeader>::mapping( IO.mapRequired("Flags", FileHdr.Flags); } +void MappingTraits<XCOFFYAML::Symbol>::mapping(IO &IO, XCOFFYAML::Symbol &S) { + IO.mapRequired("Name", S.SymbolName); + IO.mapRequired("Value", S.Value); + IO.mapRequired("Section", S.SectionName); + IO.mapRequired("Type", S.Type); + IO.mapRequired("StorageClass", S.StorageClass); + IO.mapRequired("NumberOfAuxEntries", S.NumberOfAuxEntries); +} + void MappingTraits<XCOFFYAML::Object>::mapping(IO &IO, XCOFFYAML::Object &Obj) { IO.mapTag("!XCOFF", true); IO.mapRequired("FileHeader", Obj.Header); + IO.mapRequired("Symbols", Obj.Symbols); } } // namespace yaml |