[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