Move implementation of WriterOptionsMachO to its own file. Reduced redundant
ivars in WriterOptionsMachO instead have its methods compute ivar interactions.
Refactor mach-o Reference Kinds and introduce abstract class KindHandler.
Split up StubAtoms.hpp by architecture. Add support for 32-bit x86 stubs.
llvm-svn: 158336
diff --git a/lld/lib/ReaderWriter/MachO/WriterOptionsMachO.cpp b/lld/lib/ReaderWriter/MachO/WriterOptionsMachO.cpp
new file mode 100644
index 0000000..b909464
--- /dev/null
+++ b/lld/lib/ReaderWriter/MachO/WriterOptionsMachO.cpp
@@ -0,0 +1,144 @@
+//===- lib/ReaderWriter/MachO/WriterOptionsMachO.cpp ----------------------===//
+//
+// The LLVM Linker
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "lld/ReaderWriter/WriterMachO.h"
+
+#include "llvm/Support/Debug.h"
+#include "llvm/Support/ErrorHandling.h"
+#include "llvm/Support/system_error.h"
+
+#include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/StringRef.h"
+
+#include "MachOFormat.hpp"
+
+namespace lld {
+
+WriterOptionsMachO::WriterOptionsMachO()
+ : _outputkind(outputDynamicExecutable),
+ _architecture(arch_x86),
+ _pageZeroSize(0x1000),
+ _noTextRelocations(true) {
+}
+
+WriterOptionsMachO::~WriterOptionsMachO() {
+}
+
+StringRef WriterOptionsMachO::archName() const {
+ switch ( _architecture ) {
+ case arch_x86_64:
+ return StringRef("x86_64");
+ case arch_x86:
+ return StringRef("i386");
+ case arch_armv6:
+ return StringRef("armv6");
+ case arch_armv7:
+ return StringRef("armv7");
+ }
+ assert(0 && "unknown arch");
+ return StringRef("???");
+}
+
+uint32_t WriterOptionsMachO::cpuType() const {
+ switch ( _architecture ) {
+ case arch_x86_64:
+ return mach_o::CPU_TYPE_X86_64;
+ case arch_x86:
+ return mach_o::CPU_TYPE_I386;
+ case arch_armv6:
+ case arch_armv7:
+ return mach_o::CPU_TYPE_ARM;
+ }
+ assert(0 && "unknown arch");
+ return 0;
+}
+
+uint32_t WriterOptionsMachO::cpuSubtype() const {
+ switch ( _architecture ) {
+ case arch_x86_64:
+ return mach_o::CPU_SUBTYPE_X86_64_ALL;
+ case arch_x86:
+ return mach_o::CPU_SUBTYPE_X86_ALL;
+ case arch_armv6:
+ return mach_o::CPU_SUBTYPE_ARM_V6;
+ case arch_armv7:
+ return mach_o::CPU_SUBTYPE_ARM_V7;
+ }
+ assert(0 && "unknown arch");
+ return 0;
+}
+
+uint64_t WriterOptionsMachO::pageZeroSize() const {
+ switch ( _outputkind ) {
+ case outputDynamicExecutable:
+ return _pageZeroSize;
+ case outputDylib:
+ case outputBundle:
+ case outputObjectFile:
+ assert(_pageZeroSize == 0);
+ return 0;
+ }
+ assert(0 && "unknown outputkind");
+ return 0;
+}
+
+bool WriterOptionsMachO::addEntryPointLoadCommand() const {
+ switch ( _outputkind ) {
+ case outputDynamicExecutable:
+ // Only main executables have an entry point
+ return false;
+ case outputDylib:
+ case outputBundle:
+ case outputObjectFile:
+ return false;
+ }
+ assert(0 && "unknown outputkind");
+ return false;
+}
+
+bool WriterOptionsMachO::addUnixThreadLoadCommand() const {
+ switch ( _outputkind ) {
+ case outputDynamicExecutable:
+ // Only main executables have an entry point
+ return true;
+ case outputDylib:
+ case outputBundle:
+ case outputObjectFile:
+ return false;
+ }
+ assert(0 && "unknown outputkind");
+ return false;
+}
+
+StringRef WriterOptionsMachO::entryPointName() const {
+ switch ( _outputkind ) {
+ case outputDynamicExecutable:
+ // Only main executables have an entry point
+ if ( ! _customEntryPointName.empty() ) {
+ return _customEntryPointName;
+ }
+ else {
+ if ( true || this->addEntryPointLoadCommand() )
+ return StringRef("_main");
+ else
+ return StringRef("start");
+ }
+ break;
+ case outputDylib:
+ case outputBundle:
+ case outputObjectFile:
+ return StringRef();
+ }
+ assert(0 && "unknown outputkind");
+ return StringRef();
+}
+
+
+} // namespace lld
+