[llvm] cf15d23 - [ObjectYAML] Basic support for chained fixups.

Daniel Rodríguez Troitiño via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 11 10:26:29 PST 2022


Author: Daniel Rodríguez Troitiño
Date: 2022-11-11T10:15:30-08:00
New Revision: cf15d23e80af0e44ff5893d675294024bdd90eb8

URL: https://github.com/llvm/llvm-project/commit/cf15d23e80af0e44ff5893d675294024bdd90eb8
DIFF: https://github.com/llvm/llvm-project/commit/cf15d23e80af0e44ff5893d675294024bdd90eb8.diff

LOG: [ObjectYAML] Basic support for chained fixups.

Add basic binary support for chained fixups. This allows basic tests
with chained fixups without trying to create a format for them until the
work on the Object library is considered finished.

Reviewed By: pete

Differential Revision: https://reviews.llvm.org/D134250

Added: 
    llvm/test/ObjectYAML/MachO/chained-fixups.yaml

Modified: 
    llvm/include/llvm/ObjectYAML/MachOYAML.h
    llvm/lib/ObjectYAML/MachOEmitter.cpp
    llvm/lib/ObjectYAML/MachOYAML.cpp
    llvm/tools/obj2yaml/macho2yaml.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/ObjectYAML/MachOYAML.h b/llvm/include/llvm/ObjectYAML/MachOYAML.h
index 9b506eb3ce17a..7d35766cc2420 100644
--- a/llvm/include/llvm/ObjectYAML/MachOYAML.h
+++ b/llvm/include/llvm/ObjectYAML/MachOYAML.h
@@ -130,6 +130,7 @@ struct LinkEditData {
   std::vector<yaml::Hex32> IndirectSymbols;
   std::vector<yaml::Hex64> FunctionStarts;
   std::vector<DataInCodeEntry> DataInCode;
+  std::vector<yaml::Hex8> ChainedFixups;
 
   bool isEmpty() const;
 };

diff  --git a/llvm/lib/ObjectYAML/MachOEmitter.cpp b/llvm/lib/ObjectYAML/MachOEmitter.cpp
index c6affc0157acc..75ff2efd01e41 100644
--- a/llvm/lib/ObjectYAML/MachOEmitter.cpp
+++ b/llvm/lib/ObjectYAML/MachOEmitter.cpp
@@ -56,6 +56,7 @@ class MachOWriter {
   void writeExportTrie(raw_ostream &OS);
   void writeDynamicSymbolTable(raw_ostream &OS);
   void writeFunctionStarts(raw_ostream &OS);
+  void writeChainedFixups(raw_ostream &OS);
   void writeDataInCode(raw_ostream &OS);
 
   void dumpExportEntry(raw_ostream &OS, MachOYAML::ExportEntry &Entry);
@@ -487,6 +488,7 @@ void MachOWriter::writeLinkEditData(raw_ostream &OS) {
   MachO::symtab_command *SymtabCmd = nullptr;
   MachO::dysymtab_command *DSymtabCmd = nullptr;
   MachO::linkedit_data_command *FunctionStartsCmd = nullptr;
+  MachO::linkedit_data_command *ChainedFixupsCmd = nullptr;
   MachO::linkedit_data_command *DataInCodeCmd = nullptr;
   for (auto &LC : Obj.LoadCommands) {
     switch (LC.Data.load_command_data.cmd) {
@@ -520,6 +522,11 @@ void MachOWriter::writeLinkEditData(raw_ostream &OS) {
       WriteQueue.push_back(std::make_pair(FunctionStartsCmd->dataoff,
                                           &MachOWriter::writeFunctionStarts));
       break;
+    case MachO::LC_DYLD_CHAINED_FIXUPS:
+      ChainedFixupsCmd = &LC.Data.linkedit_data_command_data;
+      WriteQueue.push_back(std::make_pair(ChainedFixupsCmd->dataoff,
+                                          &MachOWriter::writeChainedFixups));
+      break;
     case MachO::LC_DATA_IN_CODE:
       DataInCodeCmd = &LC.Data.linkedit_data_command_data;
       WriteQueue.push_back(std::make_pair(DataInCodeCmd->dataoff,
@@ -602,6 +609,12 @@ void MachOWriter::writeDataInCode(raw_ostream &OS) {
   }
 }
 
+void MachOWriter::writeChainedFixups(raw_ostream &OS) {
+  if (Obj.LinkEdit.ChainedFixups.size() > 0)
+    OS.write(reinterpret_cast<const char *>(Obj.LinkEdit.ChainedFixups.data()),
+             Obj.LinkEdit.ChainedFixups.size());
+}
+
 class UniversalWriter {
 public:
   UniversalWriter(yaml::YamlObjectFile &ObjectFile)

diff  --git a/llvm/lib/ObjectYAML/MachOYAML.cpp b/llvm/lib/ObjectYAML/MachOYAML.cpp
index 7ba30c1b0d5fa..8c8b4532dcdec 100644
--- a/llvm/lib/ObjectYAML/MachOYAML.cpp
+++ b/llvm/lib/ObjectYAML/MachOYAML.cpp
@@ -30,7 +30,7 @@ bool MachOYAML::LinkEditData::isEmpty() const {
                   WeakBindOpcodes.size() + LazyBindOpcodes.size() +
                   ExportTrie.Children.size() + NameList.size() +
                   StringTable.size() + FunctionStarts.size() +
-                  DataInCode.size();
+                  ChainedFixups.size() + DataInCode.size();
 }
 
 namespace yaml {
@@ -167,6 +167,7 @@ void MappingTraits<MachOYAML::LinkEditData>::mapping(
   IO.mapOptional("StringTable", LinkEditData.StringTable);
   IO.mapOptional("IndirectSymbols", LinkEditData.IndirectSymbols);
   IO.mapOptional("FunctionStarts", LinkEditData.FunctionStarts);
+  IO.mapOptional("ChainedFixups", LinkEditData.ChainedFixups);
   IO.mapOptional("DataInCode", LinkEditData.DataInCode);
 }
 

diff  --git a/llvm/test/ObjectYAML/MachO/chained-fixups.yaml b/llvm/test/ObjectYAML/MachO/chained-fixups.yaml
new file mode 100644
index 0000000000000..a9d025c439457
--- /dev/null
+++ b/llvm/test/ObjectYAML/MachO/chained-fixups.yaml
@@ -0,0 +1,227 @@
+--- !mach-o
+FileHeader:
+  magic:           0xFEEDFACF
+  cputype:         0x1000007
+  cpusubtype:      0x3
+  filetype:        0x2
+  ncmds:           15
+  sizeofcmds:      728
+  flags:           0x200085
+  reserved:        0x0
+LoadCommands:
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         __PAGEZERO
+    vmaddr:          0
+    vmsize:          4294967296
+    fileoff:         0
+    filesize:        0
+    maxprot:         0
+    initprot:        0
+    nsects:          0
+    flags:           0
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         232
+    segname:         __TEXT
+    vmaddr:          4294967296
+    vmsize:          16384
+    fileoff:         0
+    filesize:        16384
+    maxprot:         5
+    initprot:        5
+    nsects:          2
+    flags:           0
+    Sections:
+      - sectname:        __text
+        segname:         __TEXT
+        addr:            0x100003FB0
+        size:            8
+        offset:          0x3FB0
+        align:           4
+        reloff:          0x0
+        nreloc:          0
+        flags:           0x80000400
+        reserved1:       0x0
+        reserved2:       0x0
+        reserved3:       0x0
+        content:         C30F1F0000000000
+      - sectname:        __unwind_info
+        segname:         __TEXT
+        addr:            0x100003FB8
+        size:            72
+        offset:          0x3FB8
+        align:           2
+        reloff:          0x0
+        nreloc:          0
+        flags:           0x0
+        reserved1:       0x0
+        reserved2:       0x0
+        reserved3:       0x0
+        content:         010000001C000000000000001C000000000000001C00000002000000B03F00003400000034000000B93F00000000000034000000030000000C000100100001000000000000000000
+  - cmd:             LC_SEGMENT_64
+    cmdsize:         72
+    segname:         __LINKEDIT
+    vmaddr:          4294983680
+    vmsize:          16384
+    fileoff:         16384
+    filesize:        176
+    maxprot:         1
+    initprot:        1
+    nsects:          0
+    flags:           0
+  - cmd:             LC_DYLD_CHAINED_FIXUPS
+    cmdsize:         16
+    dataoff:         16384
+    datasize:        56
+  - cmd:             LC_DYLD_EXPORTS_TRIE
+    cmdsize:         16
+    dataoff:         16440
+    datasize:        48
+  - cmd:             LC_SYMTAB
+    cmdsize:         24
+    symoff:          16504
+    nsyms:           2
+    stroff:          16536
+    strsize:         32
+  - cmd:             LC_DYSYMTAB
+    cmdsize:         80
+    ilocalsym:       0
+    nlocalsym:       0
+    iextdefsym:      0
+    nextdefsym:      2
+    iundefsym:       2
+    nundefsym:       0
+    tocoff:          0
+    ntoc:            0
+    modtaboff:       0
+    nmodtab:         0
+    extrefsymoff:    0
+    nextrefsyms:     0
+    indirectsymoff:  0
+    nindirectsyms:   0
+    extreloff:       0
+    nextrel:         0
+    locreloff:       0
+    nlocrel:         0
+  - cmd:             LC_LOAD_DYLINKER
+    cmdsize:         32
+    name:            12
+    Content:         '/usr/lib/dyld'
+    ZeroPadBytes:    7
+  - cmd:             LC_UUID
+    cmdsize:         24
+    uuid:            362D6303-E0AC-3074-B083-CF48B87DB35D
+  - cmd:             LC_BUILD_VERSION
+    cmdsize:         32
+    platform:        1
+    minos:           786432
+    sdk:             787200
+    ntools:          1
+    Tools:
+      - tool:            3
+        version:         50069504
+  - cmd:             LC_SOURCE_VERSION
+    cmdsize:         16
+    version:         0
+  - cmd:             LC_MAIN
+    cmdsize:         24
+    entryoff:        16304
+    stacksize:       0
+  - cmd:             LC_LOAD_DYLIB
+    cmdsize:         56
+    dylib:
+      name:            24
+      timestamp:       2
+      current_version: 85943299
+      compatibility_version: 65536
+    Content:         '/usr/lib/libSystem.B.dylib'
+    ZeroPadBytes:    6
+  - cmd:             LC_FUNCTION_STARTS
+    cmdsize:         16
+    dataoff:         16488
+    datasize:        8
+  - cmd:             LC_DATA_IN_CODE
+    cmdsize:         16
+    dataoff:         0
+    datasize:        0
+LinkEditData:
+  ExportTrie:
+      TerminalSize:    0
+      NodeOffset:      0
+      Name:            ''
+      Flags:           0x0
+      Address:         0x0
+      Other:           0x0
+      ImportName:      ''
+      Children:
+        - TerminalSize:    0
+          NodeOffset:      5
+          Name:            _
+          Flags:           0x0
+          Address:         0x0
+          Other:           0x0
+          ImportName:      ''
+          Children:
+            - TerminalSize:    2
+              NodeOffset:      33
+              Name:            _mh_execute_header
+              Flags:           0x0
+              Address:         0x0
+              Other:           0x0
+              ImportName:      ''
+            - TerminalSize:    3
+              NodeOffset:      37
+              Name:            main
+              Flags:           0x0
+              Address:         0x3F98
+              Other:           0x0
+              ImportName:      ''
+  NameList:
+    - n_strx:          2
+      n_type:          0xF
+      n_sect:          1
+      n_desc:          16
+      n_value:         4294967296
+    - n_strx:          22
+      n_type:          0xF
+      n_sect:          1
+      n_desc:          0
+      n_value:         4294983600
+  StringTable:
+    - ' '
+    - __mh_execute_header
+    - _main
+    - ''
+    - ''
+    - ''
+    - ''
+  FunctionStarts:  [ 0x3FB0 ]
+  ChainedFixups:   [ 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x30, 0x0,
+                     0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+                     0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+                     0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+                     0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+                     0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ]
+...
+
+# RUN: yaml2obj %s | obj2yaml | FileCheck %s
+
+# CHECK:      cmd:             LC_DYLD_CHAINED_FIXUPS
+# CHECK-NEXT: cmdsize:         16
+# CHECK-NEXT: dataoff:         [[#CHAINED_FIXUPS_OFF:]]
+# CHECK-NEXT: datasize:        [[#CHAINED_FIXUPS_SIZE: 56]]
+
+# CHECK:      cmd:             LC_DYLD_EXPORTS_TRIE
+# CHECK-NEXT: cmdsize:         16
+# CHECK-NEXT: dataoff:         [[#EXPORTS_TRIE_OFF: CHAINED_FIXUPS_OFF + CHAINED_FIXUPS_SIZE]]
+# CHECK-NEXT: datasize:        48
+
+## TODO: Need D134571 to check for export trie in LC_DYLD_EXPORTS_TRIE.
+
+# CHECK: ChainedFixups:
+# CHECK-SAME: [ 0x0, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x30, 0x0,
+# CHECK-NEXT:   0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+# CHECK-NEXT:   0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+# CHECK-NEXT:   0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+# CHECK-NEXT:   0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+# CHECK-NEXT:   0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ]

diff  --git a/llvm/tools/obj2yaml/macho2yaml.cpp b/llvm/tools/obj2yaml/macho2yaml.cpp
index 2347c6b1c508e..e5644679bb736 100644
--- a/llvm/tools/obj2yaml/macho2yaml.cpp
+++ b/llvm/tools/obj2yaml/macho2yaml.cpp
@@ -41,6 +41,7 @@ class MachODumper {
   void dumpExportTrie(std::unique_ptr<MachOYAML::Object> &Y);
   void dumpSymbols(std::unique_ptr<MachOYAML::Object> &Y);
   void dumpIndirectSymbols(std::unique_ptr<MachOYAML::Object> &Y);
+  void dumpChainedFixups(std::unique_ptr<MachOYAML::Object> &Y);
   void dumpDataInCode(std::unique_ptr<MachOYAML::Object> &Y);
 
   template <typename SectionType>
@@ -357,6 +358,7 @@ void MachODumper::dumpLinkEdit(std::unique_ptr<MachOYAML::Object> &Y) {
   dumpSymbols(Y);
   dumpIndirectSymbols(Y);
   dumpFunctionStarts(Y);
+  dumpChainedFixups(Y);
   dumpDataInCode(Y);
 }
 
@@ -622,6 +624,26 @@ void MachODumper::dumpIndirectSymbols(std::unique_ptr<MachOYAML::Object> &Y) {
     LEData.IndirectSymbols.push_back(Obj.getIndirectSymbolTableEntry(DLC, i));
 }
 
+void MachODumper::dumpChainedFixups(std::unique_ptr<MachOYAML::Object> &Y) {
+  MachOYAML::LinkEditData &LEData = Y->LinkEdit;
+
+  for (const auto &LC : Y->LoadCommands) {
+    if (LC.Data.load_command_data.cmd == llvm::MachO::LC_DYLD_CHAINED_FIXUPS) {
+      const MachO::linkedit_data_command &DC =
+          LC.Data.linkedit_data_command_data;
+      if (DC.dataoff) {
+        assert(DC.dataoff < Obj.getData().size());
+        assert(DC.dataoff + DC.datasize <= Obj.getData().size());
+        const char *Bytes = Obj.getData().data() + DC.dataoff;
+        for (size_t Idx = 0; Idx < DC.datasize; Idx++) {
+          LEData.ChainedFixups.push_back(Bytes[Idx]);
+        }
+      }
+      break;
+    }
+  }
+}
+
 void MachODumper::dumpDataInCode(std::unique_ptr<MachOYAML::Object> &Y) {
   MachOYAML::LinkEditData &LEData = Y->LinkEdit;
 


        


More information about the llvm-commits mailing list