Skip to content

[lldb][AIX] Added XCOFF Object File Header for AIX #111814

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
Nov 12, 2024

Conversation

DhruvSrivastavaX
Copy link
Contributor

@DhruvSrivastavaX DhruvSrivastavaX commented Oct 10, 2024

This PR is in reference to porting LLDB on AIX.

Link to discussions on llvm discourse and github:

  1. https://discourse.llvm.org/t/port-lldb-to-ibm-aix/80640
  2. Extending LLDB to work on AIX #101657
    The complete changes for porting are present in this draft PR:
    Extending LLDB to work on AIX #102601

Added XCOFF Object File Header for AIX.

Added base functionality for XCOFF support. Will enhance the files in incremental PRs

Details about XCOFF file format on AIX: XCOFF

Review Request: @DavidSpickett

@llvmbot
Copy link
Member

llvmbot commented Oct 10, 2024

@llvm/pr-subscribers-lldb

Author: Dhruv Srivastava (DhruvSrivastavaX)

Changes

This PR is in reference to porting LLDB on AIX.

Link to discussions on llvm discourse and github:

  1. https://discourse.llvm.org/t/port-lldb-to-ibm-aix/80640
  2. #101657
    The complete changes for porting are present in this draft PR:
    #102601

Added XCOFF Object File Header for AIX.

Commit 1: Taken Linux version for reference.
Commit 2: Modified the class and header for AIX.
Details about XCOFF file format on AIX: XCOFF

Review Request: @DavidSpickett


Full diff: https://github.com/llvm/llvm-project/pull/111814.diff

1 Files Affected:

  • (added) lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.h (+244)
diff --git a/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.h b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.h
new file mode 100644
index 00000000000000..2cb73394a0306d
--- /dev/null
+++ b/lldb/source/Plugins/ObjectFile/XCOFF/ObjectFileXCOFF.h
@@ -0,0 +1,244 @@
+//===-- ObjectFileXCOFF.h --------------------------------------- -*- C++
+//-*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLDB_SOURCE_PLUGINS_OBJECTFILE_XCOFF_OBJECTFILEXCOFF_H
+#define LLDB_SOURCE_PLUGINS_OBJECTFILE_XCOFF_OBJECTFILEXCOFF_H
+
+#include <cstdint>
+
+#include <vector>
+
+#include "lldb/Symbol/ObjectFile.h"
+#include "lldb/Utility/ArchSpec.h"
+#include "lldb/Utility/FileSpec.h"
+#include "lldb/Utility/UUID.h"
+#include "lldb/lldb-private.h"
+#include "llvm/Object/XCOFFObjectFile.h"
+
+/// \class ObjectFileXCOFF
+/// Generic XCOFF object file reader.
+///
+/// This class provides a generic XCOFF (32/64 bit) reader plugin implementing
+/// the ObjectFile protocol.
+class ObjectFileXCOFF : public lldb_private::ObjectFile {
+public:
+  // Static Functions
+  static void Initialize();
+
+  static void Terminate();
+
+  static llvm::StringRef GetPluginNameStatic() { return "xcoff"; }
+
+  static llvm::StringRef GetPluginDescriptionStatic() {
+    return "XCOFF object file reader.";
+  }
+
+  static lldb_private::ObjectFile *
+  CreateInstance(const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp,
+                 lldb::offset_t data_offset, const lldb_private::FileSpec *file,
+                 lldb::offset_t file_offset, lldb::offset_t length);
+
+  static lldb_private::ObjectFile *CreateMemoryInstance(
+      const lldb::ModuleSP &module_sp, lldb::WritableDataBufferSP data_sp,
+      const lldb::ProcessSP &process_sp, lldb::addr_t header_addr);
+
+  static size_t GetModuleSpecifications(const lldb_private::FileSpec &file,
+                                        lldb::DataBufferSP &data_sp,
+                                        lldb::offset_t data_offset,
+                                        lldb::offset_t file_offset,
+                                        lldb::offset_t length,
+                                        lldb_private::ModuleSpecList &specs);
+
+  static bool MagicBytesMatch(lldb::DataBufferSP &data_sp, lldb::addr_t offset,
+                              lldb::addr_t length);
+
+  static lldb::SymbolType MapSymbolType(llvm::object::SymbolRef::Type sym_type);
+
+  // PluginInterface protocol
+  llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
+
+  // LLVM RTTI support
+  static char ID;
+  bool isA(const void *ClassID) const override {
+    return ClassID == &ID || ObjectFile::isA(ClassID);
+  }
+  static bool classof(const ObjectFile *obj) { return obj->isA(&ID); }
+
+  // ObjectFile Protocol.
+  bool ParseHeader() override;
+
+  bool SetLoadAddress(lldb_private::Target &target, lldb::addr_t value,
+                      bool value_is_offset) override;
+
+  bool SetLoadAddressByType(lldb_private::Target &target, lldb::addr_t value,
+                            bool value_is_offset, int type_id) override;
+
+  lldb::ByteOrder GetByteOrder() const override;
+
+  bool IsExecutable() const override;
+
+  uint32_t GetAddressByteSize() const override;
+
+  lldb_private::AddressClass GetAddressClass(lldb::addr_t file_addr) override;
+
+  void ParseSymtab(lldb_private::Symtab &symtab) override;
+
+  bool IsStripped() override;
+
+  void CreateSections(lldb_private::SectionList &unified_section_list) override;
+
+  void Dump(lldb_private::Stream *s) override;
+
+  lldb_private::ArchSpec GetArchitecture() override;
+
+  lldb_private::UUID GetUUID() override;
+
+  /// Return the contents of the .gnu_debuglink section, if the object file
+  /// contains it.
+  std::optional<lldb_private::FileSpec> GetDebugLink();
+
+  uint32_t GetDependentModules(lldb_private::FileSpecList &files) override;
+
+  lldb_private::Address
+  GetImageInfoAddress(lldb_private::Target *target) override;
+
+  lldb_private::Address GetEntryPointAddress() override;
+
+  lldb_private::Address GetBaseAddress() override;
+
+  ObjectFile::Type CalculateType() override;
+
+  ObjectFile::Strata CalculateStrata() override;
+
+  llvm::StringRef
+  StripLinkerSymbolAnnotations(llvm::StringRef symbol_name) const override;
+
+  void RelocateSection(lldb_private::Section *section) override;
+
+  lldb_private::DataExtractor ReadImageData(uint32_t offset, size_t size);
+
+  ObjectFileXCOFF(const lldb::ModuleSP &module_sp, lldb::DataBufferSP data_sp,
+                  lldb::offset_t data_offset,
+                  const lldb_private::FileSpec *file, lldb::offset_t offset,
+                  lldb::offset_t length);
+
+  ObjectFileXCOFF(const lldb::ModuleSP &module_sp,
+                  lldb::DataBufferSP header_data_sp,
+                  const lldb::ProcessSP &process_sp, lldb::addr_t header_addr);
+
+protected:
+  typedef struct xcoff_header {
+    uint16_t magic;
+    uint16_t nsects;
+    uint32_t modtime;
+    uint64_t symoff;
+    uint32_t nsyms;
+    uint16_t auxhdrsize;
+    uint16_t flags;
+  } xcoff_header_t;
+
+  typedef struct xcoff_aux_header {
+    uint16_t AuxMagic;
+    uint16_t Version;
+    uint32_t ReservedForDebugger;
+    uint64_t TextStartAddr;
+    uint64_t DataStartAddr;
+    uint64_t TOCAnchorAddr;
+    uint16_t SecNumOfEntryPoint;
+    uint16_t SecNumOfText;
+    uint16_t SecNumOfData;
+    uint16_t SecNumOfTOC;
+    uint16_t SecNumOfLoader;
+    uint16_t SecNumOfBSS;
+    uint16_t MaxAlignOfText;
+    uint16_t MaxAlignOfData;
+    uint16_t ModuleType;
+    uint8_t CpuFlag;
+    uint8_t CpuType;
+    uint8_t TextPageSize;
+    uint8_t DataPageSize;
+    uint8_t StackPageSize;
+    uint8_t FlagAndTDataAlignment;
+    uint64_t TextSize;
+    uint64_t InitDataSize;
+    uint64_t BssDataSize;
+    uint64_t EntryPointAddr;
+    uint64_t MaxStackSize;
+    uint64_t MaxDataSize;
+    uint16_t SecNumOfTData;
+    uint16_t SecNumOfTBSS;
+    uint16_t XCOFF64Flag;
+  } xcoff_aux_header_t;
+
+  typedef struct section_header {
+    char name[8];
+    uint64_t phyaddr; // Physical Addr
+    uint64_t vmaddr;  // Virtual Addr
+    uint64_t size;    // Section size
+    uint64_t offset;  // File offset to raw data
+    uint64_t reloff;  // Offset to relocations
+    uint64_t lineoff; // Offset to line table entries
+    uint32_t nreloc;  // Number of relocation entries
+    uint32_t nline;   // Number of line table entries
+    uint32_t flags;
+  } section_header_t;
+
+  typedef struct xcoff_symbol {
+    uint64_t value;
+    uint32_t offset;
+    uint16_t sect;
+    uint16_t type;
+    uint8_t storage;
+    uint8_t naux;
+  } xcoff_symbol_t;
+
+  typedef struct xcoff_sym_csect_aux_entry {
+    uint32_t section_or_len_low_byte;
+    uint32_t parameter_hash_index;
+    uint16_t type_check_sect_num;
+    uint8_t symbol_alignment_and_type;
+    uint8_t storage_mapping_class;
+    uint32_t section_or_len_high_byte;
+    uint8_t pad;
+    uint8_t aux_type;
+  } xcoff_sym_csect_aux_entry_t;
+
+  static bool ParseXCOFFHeader(lldb_private::DataExtractor &data,
+                               lldb::offset_t *offset_ptr,
+                               xcoff_header_t &xcoff_header);
+  bool ParseXCOFFOptionalHeader(lldb_private::DataExtractor &data,
+                                lldb::offset_t *offset_ptr);
+  bool ParseSectionHeaders(uint32_t offset);
+
+  std::vector<LoadableData>
+  GetLoadableData(lldb_private::Target &target) override;
+
+  static lldb::WritableDataBufferSP
+  MapFileDataWritable(const lldb_private::FileSpec &file, uint64_t Size,
+                      uint64_t Offset);
+  llvm::StringRef GetSectionName(const section_header_t &sect);
+  static lldb::SectionType GetSectionType(llvm::StringRef sect_name,
+                                          const section_header_t &sect);
+
+  uint32_t ParseDependentModules();
+  typedef std::vector<section_header_t> SectionHeaderColl;
+
+private:
+  bool CreateBinary();
+
+  xcoff_header_t m_xcoff_header;
+  xcoff_aux_header_t m_xcoff_aux_header;
+  SectionHeaderColl m_sect_headers;
+  std::unique_ptr<llvm::object::XCOFFObjectFile> m_binary;
+  lldb_private::Address m_entry_point_address;
+  std::optional<lldb_private::FileSpecList> m_deps_filespec;
+  std::map<std::string, std::vector<std::string>> m_deps_base_members;
+};
+
+#endif // LLDB_SOURCE_PLUGINS_OBJECTFILE_ELF_OBJECTFILEELF_H

@labath
Copy link
Collaborator

labath commented Oct 10, 2024

A couple of quick notes:

  • are you sure that ObjectFileELF is the best thing to start with here? Based on the name, I would expect that ObjectFilePECOFF would be a better baseline. Or maybe the object file format is different enough from all of the existing ones that this kind of comparison is not useful?
  • without also seeing the cpp file, it hard to judge how similar it is to the other plugin
  • instead of redeclaring all the header types, would it be possible to use some structures from llvm? (I know that ObjectFileELF does not do that, but that's because it is very old. ObjectFilePECOFF -- a much newer class -- does just that)
  • a lot of the object file code should be testable on its own. If you include the necessary plugin glue in this PR, then you should be able to write tests similar to those in lldb/test/Shell/ObjectFile. For example, if you could start with a test similar to test/Shell/ObjectFile/ELF/basic-info.yaml and then include enough of code in the PR to make that pass.

@DhruvSrivastavaX
Copy link
Contributor Author

DhruvSrivastavaX commented Oct 10, 2024

Hi Community Members,

Apologies for being away for a while as I was occupied with some other activities.
Here's some update at what all we are working on based on the past discussions:

  1. Removed the CMAKE flag __AIX__ and replaced it with the LLVM environment's _AIX flag [Done]

  2. We are working on merging some of the common files (like HostInfoAIX.cpp etc) derived from Linux while avoiding any major impact, as per @labath 's suggestions.

  3. Working on creating a draft PR as suggested by @DavidSpickett , to highlight all the #if (_AIX) kind of code in the draft PR, to see the overall impact.

  4. Implementing additional functionalities which are currently missing on AIX.

  5. Rearranging some of the code in the draft PR based on the previous discussions.

Going forward @Lakshmi-Surekha will also be assisting me in some of the upstreaming activities.

Thanks & Regards

@DhruvSrivastavaX
Copy link
Contributor Author

DhruvSrivastavaX commented Oct 10, 2024

A couple of quick notes:

  • are you sure that ObjectFileELF is the best thing to start with here? Based on the name, I would expect that ObjectFilePECOFF would be a better baseline. Or maybe the object file format is different enough from all of the existing ones that this kind of comparison is not useful?
  • without also seeing the cpp file, it hard to judge how similar it is to the other plugin
  • instead of redeclaring all the header types, would it be possible to use some structures from llvm? (I know that ObjectFileELF does not do that, but that's because it is very old. ObjectFilePECOFF -- a much newer class -- does just that)
  • a lot of the object file code should be testable on its own. If you include the necessary plugin glue in this PR, then you should be able to write tests similar to those in lldb/test/Shell/ObjectFile. For example, if you could start with a test similar to test/Shell/ObjectFile/ELF/basic-info.yaml and then include enough of code in the PR to make that pass.

Hi @labath ,

  1. Actually there might be slight similarities with ObjectFilePECOFF, but the overall format structure is very different to be compared to any one of the existing formats, so I have just taken the ObjectFileELF.h only as a base to follow the general class/file arrangement, is all.
  2. As per our last discussion, I have planned to drop each of the major files separately, so I can push the .cpp file as another PR, and both of these can be used for comparison.
  3. From a surface level I can see that ObjectFilePECOFF has also created its own new structures based on its file format, essentially we have done something similar for XCOFF. Although, let me check the existing llvm structures for XCOFF thoroughly and get back to you on this.
  4. So, as per your suggestion, what path flow should we take?
    Based on previous discussions, as of now I am planning a PR for .h file, another PR for .cpp file and a final PR for the test cases. Is that okay?

@labath
Copy link
Collaborator

labath commented Oct 11, 2024

A couple of quick notes:

  • are you sure that ObjectFileELF is the best thing to start with here? Based on the name, I would expect that ObjectFilePECOFF would be a better baseline. Or maybe the object file format is different enough from all of the existing ones that this kind of comparison is not useful?
  • without also seeing the cpp file, it hard to judge how similar it is to the other plugin
  • instead of redeclaring all the header types, would it be possible to use some structures from llvm? (I know that ObjectFileELF does not do that, but that's because it is very old. ObjectFilePECOFF -- a much newer class -- does just that)
  • a lot of the object file code should be testable on its own. If you include the necessary plugin glue in this PR, then you should be able to write tests similar to those in lldb/test/Shell/ObjectFile. For example, if you could start with a test similar to test/Shell/ObjectFile/ELF/basic-info.yaml and then include enough of code in the PR to make that pass.

Hi @labath ,

1. Actually there might be slight similarities with ObjectFilePECOFF, but the overall format structure is very different to be compared to any one of the existing formats, so I have just taken the ObjectFileELF.h only as a base to follow the general class/file arrangement, is all.

2. As per our last discussion, I have planned to drop each of the major files separately, so I can push the .cpp file as another PR, and both of these can be used for comparison.

That's okay, though I fear you're taking this a bit too literally. I definitely wanted to split that PR up, but this is a bit too far. It would be better to have the header and the matching cpp file in the same PR, since you usually need to look at them in tandem.

That said, the main reason we (or I, at least) wanted to see this kind of a PR is to determine whether it makes sense to merge this with some of the existing code. For ObjectFileELF, I'm pretty confident the answer to that is going to be "no" (I'm slightly less sure about ObjectFilePECOFF, but I think I'd be willing to take your word for it -- I think a good litmus test would be whether the PECOFF and XCOFF parsing code in llvm shares anything). Given that, the comparison to a different object file plugin is not really interesting to me, as I believe that means this part of code should be treated as any new code that's being added to llvm. In particular, that it should be subject to the incremental development policy.

This is where I was coming from when I wrote the previous message (I did not include the context, as I was in a bit of a
hurry -- sorry). Incremental development means developing (and reviewing, and submitting) the change in small pieces that can be easily reviewed and come with their own tests. What exactly is a small piece is not easy to determine, but it's usually less than "an entire file". For an object file plugin, a relatively reasonable sequence would be:

  • parse the file headers (enough so you can detect the file format and answer questions like what is its architecture)
  • parse sections
  • parse symbols
  • other stuff (?)

I know this is going to be more work, and it's going to be a bit awkward to re-engineer a finished file into an incremental set of changes, but what you have is essentially a long-term development branch -- exactly the thing which the policy discourages. I'm not asking this because I want to be difficult, but large changes really are hard to review.

@DhruvSrivastavaX
Copy link
Contributor Author

Okay sure.
Thats not a problem Pavel, better to have it in smaller understandable pieces, so that it can be organised and reviewed properly.

There are a couple of incoming code with such huge changes, it will be good to adhere to this systematic approach.

So, I will go ahead and modify this PR to drop a smaller piece of ObjectFileXCOFF.h and ObjectFileXCOFF.cpp instead,
which can be reviewed easily (some base skeleton and declaration of parent virtual functions etc).
Once that gets pulled in, I will build my next few PRs on that in order to complete these new additions.
Will also try to add relevant test cases.

Thanks!

@labath
Copy link
Collaborator

labath commented Oct 15, 2024

Thank you for your understanding.

Before trying to split up the other large files (a fairly large undertaking), I'd still recommend doing the initial thing of dropping the file in a PR (which should be relatively fast) and getting some feedback. ObjectFile plugins are one of the (few) things which I know that can be reasonably split and tested in multiple PRs. Unfortunately, most of the other plugins are much trickier, so we may need to get more creative.

Copy link

github-actions bot commented Oct 17, 2024

✅ With the latest revision this PR passed the C/C++ code formatter.

@DhruvSrivastavaX
Copy link
Contributor Author

Hi @labath ,
I have dropped some base structure and yaml test cases for the ObjectFileXCOFF support.
Please provide your comments.

Copy link
Collaborator

@labath labath left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is exactly what I had in mind -- thank you.

The patch looks mostly good, apart from the inline comments. My main question is about the "dependant modules" parsing code. AFAICT, its not actually functional (and not tested). Is yaml2objs xcoff backend sufficiently developed to create a test for the dependant module functionality? Given that we rely on llvm for parsing that, we don't have to test it extensively, but it would be nice to have at least one test. We could either do that in this patch, or rip out the dependant module functionality, and add it back in another patch -- up to you.

PluginManager::UnregisterPlugin(CreateInstance);
}

bool UGLY_FLAG_FOR_AIX __attribute__((weak)) = false;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We're going to have to find a different way to achieve whatever this is trying to achieve. Let's remove that, as it should not be necessary for this patch.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, sure. It is actually used in other files as a flag. But we can check on it later.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see its used in the dwarf parser. We can deal with that later. My suggestion would be to look at how the llvm dwarf parser (llvm-dwarfdump) does this.

return 0;

std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
if (m_deps_filespec)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm confused. Who fills in this variable?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Filtered out for now.

@DhruvSrivastavaX
Copy link
Contributor Author

This is exactly what I had in mind -- thank you.

The patch looks mostly good, apart from the inline comments. My main question is about the "dependant modules" parsing code. AFAICT, its not actually functional (and not tested). Is yaml2objs xcoff backend sufficiently developed to create a test for the dependant module functionality? Given that we rely on llvm for parsing that, we don't have to test it extensively, but it would be nice to have at least one test. We could either do that in this patch, or rip out the dependant module functionality, and add it back in another patch -- up to you.

Great. Thanks for your inputs too.
Yes, I think we can add dependant modules related changes later. I have removed them for now.
About the yaml xcoff testing,
For a basic test case as this one, it works great! I also tried using obj2yaml and on a compiled executable for a basic .c test case, and then reversing it with yaml2obj and that works fine too. But for the dependant module functionality, I might need to check some more, we can check on that in the later PRs.

On another note, I have a doubt or maybe I am missing something: I am able to run lldb-test successfully on my aix system setup for this new basic xcoff file (where I have the entire aix changes along with a reduced xcoff same as in this PR).
But lldb-test does not recognize the object file generated by yaml2obj on a linux ppc64 system (where I have only the merged changes and the xcoff changes only present in this PR). Is it not supposed to work that way or am I missing something?
Any suggestions about what can I try would be great!

@labath
Copy link
Collaborator

labath commented Oct 18, 2024

But lldb-test does not recognize the object file generated by yaml2obj on a linux ppc64 system (where I have only the merged changes and the xcoff changes only present in this PR). Is it not supposed to work that way or am I missing something?

It should work. It's likely that you missed some critical (small) piece of functionality that causes lldb to think the input is not valid. It should be fairly easy to step through the relevant code in lldb-test and see where it bails out (then to implement whatever is necessary to make it not do that). We don't run lldb tests on ppc64 on a regular basis, so it's also possible you're missing hitting some bug specific to that host, but I don't think that's the (only) problem here, as the test doesn't pass for me on x86 either.

@DhruvSrivastavaX
Copy link
Contributor Author

Ok right.
Yes, and it is working fine on AIX.
Let me get a little more familiar with lldb-test's working and I will try to figure out what's wrong.
Thanks!

@DhruvSrivastavaX
Copy link
Contributor Author

Hi @labath,
So the error was due to the endianness difference between Linux and AIX.
The previous failure with the new test case has gone now.
I have dropped a fix so that AIX binary is recognised on little endian platforms as well, but
if there is any better way to add this check, please do let me know.
Thanks!

@labath
Copy link
Collaborator

labath commented Nov 11, 2024

Hi @labath, So the error was due to the endianness difference between Linux and AIX. The previous failure with the new test case has gone now. I have dropped a fix so that AIX binary is recognised on little endian platforms as well, but if there is any better way to add this check, please do let me know. Thanks!

Are XCOFF files always big endian? If so, then all you need is to add a DataExtractor::SetByteOrder(). If not (and you want to support both endiannesses), then it would be better to add both cases to XCOFFHeaderSizeFromMagic.

@DhruvSrivastavaX
Copy link
Contributor Author

Are XCOFF files always big endian? If so, then all you need is to add a DataExtractor::SetByteOrder(). If not (and you want to support both endiannesses), then it would be better to add both cases to XCOFFHeaderSizeFromMagic.

Yes, AIX XCOFF does not support little endian, so I went ahead with the SetByteOrder Fix.

Copy link
Collaborator

@labath labath left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good. Thanks. Do you need someone to push the merge button?

@DhruvSrivastavaX
Copy link
Contributor Author

Looks good. Thanks. Do you need someone to push the merge button?

Ok, great. Yes, please merge it, I don't have the permission to do that yet.

@labath labath merged commit ca4cd08 into llvm:main Nov 12, 2024
7 checks passed
Groverkss pushed a commit to iree-org/llvm-project that referenced this pull request Nov 15, 2024
Added XCOFF Object File Header for AIX.

Added base functionality for XCOFF support. Will enhance the files in
incremental PRs

Details about XCOFF file format on AIX:
[XCOFF](https://www.ibm.com/docs/en/aix/7.3?topic=formats-xcoff-object-file-format)
@DhruvSrivastavaX DhruvSrivastavaX deleted the aix-xcoff-header branch December 27, 2024 11:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants