[PATCH] [lld][mach-o] binary reader and writer

kledzik at apple.com kledzik at apple.com
Mon Nov 4 18:30:09 PST 2013


  Regarding templates, I used templates in the darwin linker for endian/pointer size issues.  After working with it for years, I found it to caused too much code bloat and it is pushes templates on to clients which either have to templatize all their code or take the time to instantiate all the right templates in the right places.

  The "normalized mach-o" model is that everything in memory is always 64-bit and host endian.  There are just these few places that deal with mach-o format structures that have to deal with it.  The rest of mach-o processing (still to come) never has to deal with pointer or endian (or template) issues!


================
Comment at: lib/ReaderWriter/MachO/MachOLinkingContext.cpp:75-87
@@ -72,13 +74,15 @@
 static ArchInfo archInfos[] = {
-  { "x86_64", MachOLinkingContext::arch_x86_64, llvm::MachO::CPU_TYPE_X86_64,
-    llvm::MachO::CPU_SUBTYPE_X86_64_ALL },
-  { "i386", MachOLinkingContext::arch_x86, llvm::MachO::CPU_TYPE_I386,
-    llvm::MachO::CPU_SUBTYPE_X86_ALL },
-  { "armv6", MachOLinkingContext::arch_armv6, llvm::MachO::CPU_TYPE_ARM,
-    llvm::MachO::CPU_SUBTYPE_ARM_V6 },
-  { "armv7", MachOLinkingContext::arch_armv7, llvm::MachO::CPU_TYPE_ARM,
-    llvm::MachO::CPU_SUBTYPE_ARM_V7 },
-  { "armv7s", MachOLinkingContext::arch_armv7s, llvm::MachO::CPU_TYPE_ARM,
-    llvm::MachO::CPU_SUBTYPE_ARM_V7S },
-  { StringRef(), MachOLinkingContext::arch_unknown, 0, 0 }
+  { "x86_64", MachOLinkingContext::arch_x86_64, true, 
+          llvm::MachO::CPU_TYPE_X86_64, llvm::MachO::CPU_SUBTYPE_X86_64_ALL },
+  { "i386", MachOLinkingContext::arch_x86,  true, 
+              llvm::MachO::CPU_TYPE_I386, llvm::MachO::CPU_SUBTYPE_X86_ALL },
+  { "ppc", MachOLinkingContext::arch_ppc,  false, 
+          llvm::MachO::CPU_TYPE_POWERPC, llvm::MachO::CPU_SUBTYPE_POWERPC_ALL },
+  { "armv6", MachOLinkingContext::arch_armv6,  true, 
+                  llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V6 },
+  { "armv7", MachOLinkingContext::arch_armv7,  true, 
+                  llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7 },
+  { "armv7s", MachOLinkingContext::arch_armv7s,  true, 
+                  llvm::MachO::CPU_TYPE_ARM, llvm::MachO::CPU_SUBTYPE_ARM_V7S },
+  { StringRef(), MachOLinkingContext::arch_unknown, false, 0, 0 }
 };
----------------
Michael Spencer wrote:
> Indentation is weird here.
Its a really wide table.  I'll make each row be three lines so things line up.

================
Comment at: lib/ReaderWriter/MachO/MachOLinkingContext.cpp:156-164
@@ +155,11 @@
+
+bool MachOLinkingContext::isOtherEndian(Arch arch) {
+  assert(arch != arch_unknown);
+  for (ArchInfo *info = archInfos; !info->archName.empty(); ++info) {
+    if (info->arch == arch) {
+      return (info->littleEndian != llvm::sys::IsLittleEndianHost);
+    }
+  }
+  llvm_unreachable("Unknown arch type");
+}
+
----------------
Michael Spencer wrote:
> This is an odd name for this function. It should mention host.
I've renamed it isHostEndian().  It is was were _swap comes from.


http://llvm-reviews.chandlerc.com/D2101

BRANCH
  svn

ARCANIST PROJECT
  lld



More information about the llvm-commits mailing list