summaryrefslogtreecommitdiffstats
path: root/lld/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp
diff options
context:
space:
mode:
authorNick Kledzik <kledzik@apple.com>2014-05-22 01:42:06 +0000
committerNick Kledzik <kledzik@apple.com>2014-05-22 01:42:06 +0000
commita0c13a24200a605c50e643263796c38d6e49d497 (patch)
tree43544c5fedc4877a3587d7eb34b8801ece5b84f5 /lld/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp
parent9098c9f1a82202c9b1b81e8251d5d7feaea0ab27 (diff)
downloadbcm5719-llvm-a0c13a24200a605c50e643263796c38d6e49d497.tar.gz
bcm5719-llvm-a0c13a24200a605c50e643263796c38d6e49d497.zip
[mach-o] parse literal sections into atoms
llvm-svn: 209379
Diffstat (limited to 'lld/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp')
-rw-r--r--lld/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp63
1 files changed, 60 insertions, 3 deletions
diff --git a/lld/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp b/lld/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp
index ab29f858b4e..d40321bb63e 100644
--- a/lld/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp
+++ b/lld/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp
@@ -107,23 +107,80 @@ static void processUndefindeSymbol(MachOFile &file, const Symbol &sym,
}
}
+static void processSection(MachOFile &file, const Section &section,
+ bool copyRefs) {
+ unsigned offset = 0;
+ switch (section.type) {
+ case llvm::MachO::S_REGULAR:
+ case llvm::MachO::S_COALESCED:
+ case llvm::MachO::S_ZEROFILL:
+ // These sections are broken in to atoms based on symbols.
+ break;
+ case llvm::MachO::S_CSTRING_LITERALS:
+ for (size_t i = 0, e = section.content.size(); i != e; ++i) {
+ if (section.content[i] == 0) {
+ unsigned size = i - offset + 1;
+ ArrayRef<uint8_t> strContent = section.content.slice(offset, size);
+ file.addDefinedAtom(StringRef(), DefinedAtom::scopeLinkageUnit,
+ DefinedAtom::typeCString, strContent, copyRefs);
+ offset = i + 1;
+ }
+ }
+ break;
+ case llvm::MachO::S_4BYTE_LITERALS:
+ assert((section.content.size() % 4) == 0);
+ for (size_t i = 0, e = section.content.size(); i != e; i += 4) {
+ ArrayRef<uint8_t> byteContent = section.content.slice(offset, 4);
+ file.addDefinedAtom(StringRef(), DefinedAtom::scopeLinkageUnit,
+ DefinedAtom::typeLiteral4, byteContent, copyRefs);
+ offset += 4;
+ }
+ break;
+ case llvm::MachO::S_8BYTE_LITERALS:
+ assert((section.content.size() % 8) == 0);
+ for (size_t i = 0, e = section.content.size(); i != e; i += 8) {
+ ArrayRef<uint8_t> byteContent = section.content.slice(offset, 8);
+ file.addDefinedAtom(StringRef(), DefinedAtom::scopeLinkageUnit,
+ DefinedAtom::typeLiteral8, byteContent, copyRefs);
+ offset += 8;
+ }
+ break;
+ case llvm::MachO::S_16BYTE_LITERALS:
+ assert((section.content.size() % 16) == 0);
+ for (size_t i = 0, e = section.content.size(); i != e; i += 16) {
+ ArrayRef<uint8_t> byteContent = section.content.slice(offset, 16);
+ file.addDefinedAtom(StringRef(), DefinedAtom::scopeLinkageUnit,
+ DefinedAtom::typeLiteral16, byteContent, copyRefs);
+ offset += 16;
+ }
+ break;
+ default:
+ llvm_unreachable("mach-o section type not supported");
+ break;
+ }
+}
static ErrorOr<std::unique_ptr<lld::File>>
normalizedObjectToAtoms(const NormalizedFile &normalizedFile, StringRef path,
bool copyRefs) {
std::unique_ptr<MachOFile> file(new MachOFile(path));
-
+
+ // Create atoms from global symbols.
for (const Symbol &sym : normalizedFile.globalSymbols) {
processSymbol(normalizedFile, *file, sym, copyRefs);
}
-
+ // Create atoms from local symbols.
for (const Symbol &sym : normalizedFile.localSymbols) {
processSymbol(normalizedFile, *file, sym, copyRefs);
}
-
+ // Create atoms from undefinded symbols.
for (auto &sym : normalizedFile.undefinedSymbols) {
processUndefindeSymbol(*file, sym, copyRefs);
}
+ // Create atoms from sections that don't have symbols.
+ for (auto &sect : normalizedFile.sections) {
+ processSection(*file, sect, copyRefs);
+ }
return std::unique_ptr<File>(std::move(file));
}
OpenPOWER on IntegriCloud