aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/ObjectYAML/MachOEmitter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/ObjectYAML/MachOEmitter.cpp')
-rw-r--r--llvm/lib/ObjectYAML/MachOEmitter.cpp22
1 files changed, 19 insertions, 3 deletions
diff --git a/llvm/lib/ObjectYAML/MachOEmitter.cpp b/llvm/lib/ObjectYAML/MachOEmitter.cpp
index b9fad2982828..3d06f3d0bf86 100644
--- a/llvm/lib/ObjectYAML/MachOEmitter.cpp
+++ b/llvm/lib/ObjectYAML/MachOEmitter.cpp
@@ -55,6 +55,7 @@ private:
void writeStringTable(raw_ostream &OS);
void writeExportTrie(raw_ostream &OS);
void writeDynamicSymbolTable(raw_ostream &OS);
+ void writeFunctionStarts(raw_ostream &OS);
void dumpExportEntry(raw_ostream &OS, MachOYAML::ExportEntry &Entry);
void ZeroToOffset(raw_ostream &OS, size_t offset);
@@ -484,6 +485,7 @@ void MachOWriter::writeLinkEditData(raw_ostream &OS) {
MachO::dyld_info_command *DyldInfoOnlyCmd = nullptr;
MachO::symtab_command *SymtabCmd = nullptr;
MachO::dysymtab_command *DSymtabCmd = nullptr;
+ MachO::linkedit_data_command *FunctionStartsCmd = nullptr;
for (auto &LC : Obj.LoadCommands) {
switch (LC.Data.load_command_data.cmd) {
case MachO::LC_SYMTAB:
@@ -511,12 +513,15 @@ void MachOWriter::writeLinkEditData(raw_ostream &OS) {
WriteQueue.push_back(std::make_pair(
DSymtabCmd->indirectsymoff, &MachOWriter::writeDynamicSymbolTable));
break;
+ case MachO::LC_FUNCTION_STARTS:
+ FunctionStartsCmd = &LC.Data.linkedit_data_command_data;
+ WriteQueue.push_back(std::make_pair(FunctionStartsCmd->dataoff,
+ &MachOWriter::writeFunctionStarts));
+ break;
}
}
- llvm::sort(WriteQueue, [](const writeOperation &a, const writeOperation &b) {
- return a.first < b.first;
- });
+ llvm::sort(WriteQueue, llvm::less_first());
for (auto writeOp : WriteQueue) {
ZeroToOffset(OS, writeOp.first);
@@ -569,6 +574,17 @@ void MachOWriter::writeDynamicSymbolTable(raw_ostream &OS) {
sizeof(yaml::Hex32::BaseType));
}
+void MachOWriter::writeFunctionStarts(raw_ostream &OS) {
+ uint64_t Addr = 0;
+ for (uint64_t NextAddr : Obj.LinkEdit.FunctionStarts) {
+ uint64_t Delta = NextAddr - Addr;
+ encodeULEB128(Delta, OS);
+ Addr = NextAddr;
+ }
+
+ OS.write('\0');
+}
+
class UniversalWriter {
public:
UniversalWriter(yaml::YamlObjectFile &ObjectFile)