[clang-tools-extra] [clang] [llvm] [XCOFF][obj2yaml] support parsing auxiliary symbols for XCOFF (PR #70642)

2023-12-04 Thread via cfe-commits

https://github.com/EsmeYi updated 
https://github.com/llvm/llvm-project/pull/70642

>From 7ba6a651bb84befdcd1566352d5340880591789d Mon Sep 17 00:00:00 2001
From: esmeyi 
Date: Mon, 30 Oct 2023 06:00:18 -0400
Subject: [PATCH 1/7] Add support for parsing auxiliary symbols of XCOFF object
 file for obj2yaml.

---
 llvm/include/llvm/Object/XCOFFObjectFile.h|   2 +-
 llvm/lib/ObjectYAML/XCOFFYAML.cpp |  27 +-
 llvm/test/tools/obj2yaml/XCOFF/aix.yaml   |  38 +++
 .../tools/obj2yaml/XCOFF/aux-symbols.yaml | 264 ++
 llvm/tools/obj2yaml/xcoff2yaml.cpp| 185 +++-
 5 files changed, 504 insertions(+), 12 deletions(-)
 create mode 100644 llvm/test/tools/obj2yaml/XCOFF/aux-symbols.yaml

diff --git a/llvm/include/llvm/Object/XCOFFObjectFile.h 
b/llvm/include/llvm/Object/XCOFFObjectFile.h
index 63064abb4d3c3..9a3b4aa262355 100644
--- a/llvm/include/llvm/Object/XCOFFObjectFile.h
+++ b/llvm/include/llvm/Object/XCOFFObjectFile.h
@@ -411,13 +411,13 @@ class XCOFFCsectAuxRef {
 return Entry64->AuxType;
   }
 
-private:
   uint8_t getSymbolAlignmentAndType() const {
 return GETVALUE(SymbolAlignmentAndType);
   }
 
 #undef GETVALUE
 
+private:
   const XCOFFCsectAuxEnt32 *Entry32 = nullptr;
   const XCOFFCsectAuxEnt64 *Entry64 = nullptr;
 };
diff --git a/llvm/lib/ObjectYAML/XCOFFYAML.cpp 
b/llvm/lib/ObjectYAML/XCOFFYAML.cpp
index 44ef33501b65e..a9af0405546a3 100644
--- a/llvm/lib/ObjectYAML/XCOFFYAML.cpp
+++ b/llvm/lib/ObjectYAML/XCOFFYAML.cpp
@@ -282,45 +282,53 @@ static void auxSymMapping(IO &IO, 
XCOFFYAML::SectAuxEntForStat &AuxSym) {
 
 void MappingTraits>::mapping(
 IO &IO, std::unique_ptr &AuxSym) {
-  assert(!IO.outputting() && "We don't dump aux symbols currently.");
   const bool Is64 =
   static_cast(IO.getContext())->Header.Magic ==
   (llvm::yaml::Hex16)XCOFF::XCOFF64;
   XCOFFYAML::AuxSymbolType AuxType;
+  if (IO.outputting())
+AuxType = AuxSym.get()->Type;
   IO.mapRequired("Type", AuxType);
   switch (AuxType) {
   case XCOFFYAML::AUX_EXCEPT:
 if (!Is64)
   IO.setError("an auxiliary symbol of type AUX_EXCEPT cannot be defined in 
"
   "XCOFF32");
-AuxSym.reset(new XCOFFYAML::ExcpetionAuxEnt());
+if (!IO.outputting())
+  AuxSym.reset(new XCOFFYAML::ExcpetionAuxEnt());
 auxSymMapping(IO, *cast(AuxSym.get()));
 break;
   case XCOFFYAML::AUX_FCN:
-AuxSym.reset(new XCOFFYAML::FunctionAuxEnt());
+if (!IO.outputting())
+  AuxSym.reset(new XCOFFYAML::FunctionAuxEnt());
 auxSymMapping(IO, *cast(AuxSym.get()), Is64);
 break;
   case XCOFFYAML::AUX_SYM:
-AuxSym.reset(new XCOFFYAML::BlockAuxEnt());
+if (!IO.outputting())
+  AuxSym.reset(new XCOFFYAML::BlockAuxEnt());
 auxSymMapping(IO, *cast(AuxSym.get()), Is64);
 break;
   case XCOFFYAML::AUX_FILE:
-AuxSym.reset(new XCOFFYAML::FileAuxEnt());
+if (!IO.outputting())
+  AuxSym.reset(new XCOFFYAML::FileAuxEnt());
 auxSymMapping(IO, *cast(AuxSym.get()));
 break;
   case XCOFFYAML::AUX_CSECT:
-AuxSym.reset(new XCOFFYAML::CsectAuxEnt());
+if (!IO.outputting())
+  AuxSym.reset(new XCOFFYAML::CsectAuxEnt());
 auxSymMapping(IO, *cast(AuxSym.get()), Is64);
 break;
   case XCOFFYAML::AUX_SECT:
-AuxSym.reset(new XCOFFYAML::SectAuxEntForDWARF());
+if (!IO.outputting())
+  AuxSym.reset(new XCOFFYAML::SectAuxEntForDWARF());
 auxSymMapping(IO, *cast(AuxSym.get()));
 break;
   case XCOFFYAML::AUX_STAT:
 if (Is64)
   IO.setError(
   "an auxiliary symbol of type AUX_STAT cannot be defined in XCOFF64");
-AuxSym.reset(new XCOFFYAML::SectAuxEntForStat());
+if (!IO.outputting())
+  AuxSym.reset(new XCOFFYAML::SectAuxEntForStat());
 auxSymMapping(IO, *cast(AuxSym.get()));
 break;
   }
@@ -334,8 +342,7 @@ void MappingTraits::mapping(IO &IO, 
XCOFFYAML::Symbol &S) {
   IO.mapOptional("Type", S.Type);
   IO.mapOptional("StorageClass", S.StorageClass);
   IO.mapOptional("NumberOfAuxEntries", S.NumberOfAuxEntries);
-  if (!IO.outputting())
-IO.mapOptional("AuxEntries", S.AuxEntries);
+  IO.mapOptional("AuxEntries", S.AuxEntries);
 }
 
 void MappingTraits::mapping(IO &IO, 
XCOFFYAML::StringTable &Str) {
diff --git a/llvm/test/tools/obj2yaml/XCOFF/aix.yaml 
b/llvm/test/tools/obj2yaml/XCOFF/aix.yaml
index cd1e88dec11d2..fbd5fa0629d10 100644
--- a/llvm/test/tools/obj2yaml/XCOFF/aix.yaml
+++ b/llvm/test/tools/obj2yaml/XCOFF/aix.yaml
@@ -52,12 +52,30 @@
 # CHECK32-NEXT: Type:0x0
 # CHECK32-NEXT: StorageClass:C_EXT
 # CHECK32-NEXT: NumberOfAuxEntries: 1
+# CHECK32-NEXT: AuxEntries:
+# CHECK32-NEXT:   - Type:AUX_CSECT
+# CHECK32-NEXT: ParameterHashIndex: 0
+# CHECK32-NEXT: TypeChkSectNum:  0
+# CHECK32-NEXT: SymbolAlignmentAndType: 0
+# CHECK32-NEXT: StorageMappingClass: XMC_PR
+# CHECK32-NEXT: SectionOrLength: 0
+# CHECK32-NEXT: StabInfoIndex:   0
+# C

[clang-tools-extra] [clang] [llvm] [XCOFF][obj2yaml] support parsing auxiliary symbols for XCOFF (PR #70642)

2023-12-05 Thread James Henderson via cfe-commits


@@ -106,6 +126,210 @@ Error XCOFFDumper::dumpSections(ArrayRef Sections) {
   return Error::success();
 }
 
+Error XCOFFDumper::dumpFileAuxSym(XCOFFYAML::Symbol &Sym,
+  const XCOFFSymbolRef &SymbolEntRef) {
+  for (uint8_t I = 1; I <= Sym.NumberOfAuxEntries; ++I) {
+uintptr_t AuxAddress = XCOFFObjectFile::getAdvancedSymbolEntryAddress(
+SymbolEntRef.getEntryAddress(), I);
+const XCOFFFileAuxEnt *FileAuxEntPtr =
+getAuxEntPtr(AuxAddress);
+auto FileNameOrError = Obj.getCFileName(FileAuxEntPtr);
+if (!FileNameOrError)
+  return FileNameOrError.takeError();
+
+XCOFFYAML::FileAuxEnt FileAuxSym;
+FileAuxSym.FileNameOrString = FileNameOrError.get();
+FileAuxSym.FileStringType = FileAuxEntPtr->Type;
+Sym.AuxEntries.push_back(

jh7370 wrote:

Sorry, I'm not really sure I follow the conversation, as it is too much in the 
file format details. Some general comments:
1) We need enough info in the YAML produced by obj2yaml for yaml2obj to be able 
to create an identical object as was passed to obj2yaml.
2) This means we can potentially omit fields from the YAML dump if they have a 
value matching the default value yaml2obj would use if the field is omitted.
3) The less data we have in the YAML, the better, as long as the first point is 
conformed to. This is because it'll be easier to read, and if somebody is using 
obj2yaml to generate the YAML that will be used as the input in a test case, it 
is minimal and has no redundant information.

https://github.com/llvm/llvm-project/pull/70642
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang-tools-extra] [clang] [llvm] [XCOFF][obj2yaml] support parsing auxiliary symbols for XCOFF (PR #70642)

2023-12-05 Thread via cfe-commits


@@ -106,6 +126,210 @@ Error XCOFFDumper::dumpSections(ArrayRef Sections) {
   return Error::success();
 }
 
+Error XCOFFDumper::dumpFileAuxSym(XCOFFYAML::Symbol &Sym,
+  const XCOFFSymbolRef &SymbolEntRef) {
+  for (uint8_t I = 1; I <= Sym.NumberOfAuxEntries; ++I) {
+uintptr_t AuxAddress = XCOFFObjectFile::getAdvancedSymbolEntryAddress(
+SymbolEntRef.getEntryAddress(), I);
+const XCOFFFileAuxEnt *FileAuxEntPtr =
+getAuxEntPtr(AuxAddress);
+auto FileNameOrError = Obj.getCFileName(FileAuxEntPtr);
+if (!FileNameOrError)
+  return FileNameOrError.takeError();
+
+XCOFFYAML::FileAuxEnt FileAuxSym;
+FileAuxSym.FileNameOrString = FileNameOrError.get();
+FileAuxSym.FileStringType = FileAuxEntPtr->Type;
+Sym.AuxEntries.push_back(

EsmeYi wrote:

Thanks!
The aux type is not in the XCOFF32 object, but it is needed in YAML to help 
yaml2obj create the identical object.

https://github.com/llvm/llvm-project/pull/70642
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang-tools-extra] [clang] [llvm] [XCOFF][obj2yaml] support parsing auxiliary symbols for XCOFF (PR #70642)

2023-12-06 Thread via cfe-commits

https://github.com/EsmeYi closed https://github.com/llvm/llvm-project/pull/70642
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits