Allow targets to specify the MachO CPUType/CPUSubtype information.
authorJim Grosbach <grosbach@apple.com>
Fri, 5 Nov 2010 18:48:58 +0000 (18:48 +0000)
committerJim Grosbach <grosbach@apple.com>
Fri, 5 Nov 2010 18:48:58 +0000 (18:48 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118288 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MachObjectWriter.h
lib/MC/MachObjectWriter.cpp
lib/Target/ARM/ARMAsmBackend.cpp
lib/Target/X86/X86AsmBackend.cpp

index f1079e3d7cce20e56556bb68bef27c9574631e86..01f7aaffd50871fb6a2bb495e7972c6c049771ae 100644 (file)
@@ -25,7 +25,8 @@ class MachObjectWriter : public MCObjectWriter {
   void *Impl;
 
 public:
-  MachObjectWriter(raw_ostream &OS, bool Is64Bit, bool IsLittleEndian = true);
+  MachObjectWriter(raw_ostream &OS, bool Is64Bit, uint32_t CPUType,
+                   uint32_t CPUSubtype, bool IsLittleEndian = true);
   virtual ~MachObjectWriter();
 
   virtual void ExecutePostLayoutBinding(MCAssembler &Asm);
index 61df5bb35c761b234c6d31628bf97bb9deee5a80..e98d27d73e28307025e4b0dd840e547a920f9ee5 100644 (file)
@@ -290,9 +290,14 @@ class MachObjectWriterImpl {
 
   unsigned Is64Bit : 1;
 
+  uint32_t CPUType;
+  uint32_t CPUSubtype;
+
 public:
-  MachObjectWriterImpl(MachObjectWriter *_Writer, bool _Is64Bit)
-    : Writer(_Writer), OS(Writer->getStream()), Is64Bit(_Is64Bit) {
+  MachObjectWriterImpl(MachObjectWriter *_Writer, bool _Is64Bit,
+                       uint32_t _CPUType, uint32_t _CPUSubtype)
+    : Writer(_Writer), OS(Writer->getStream()), Is64Bit(_Is64Bit),
+      CPUType(_CPUType), CPUSubtype(_CPUSubtype) {
   }
 
   void Write8(uint8_t Value) { Writer->Write8(Value); }
@@ -319,10 +324,9 @@ public:
 
     Write32(Is64Bit ? Header_Magic64 : Header_Magic32);
 
-    // FIXME: Support cputype.
-    Write32(Is64Bit ? MachO::CPUTypeX86_64 : MachO::CPUTypeI386);
-    // FIXME: Support cpusubtype.
-    Write32(MachO::CPUSubType_I386_ALL);
+    Write32(CPUType);
+    Write32(CPUSubtype);
+
     Write32(HFT_Object);
     Write32(NumLoadCommands);    // Object files have a single load command, the
                                  // segment.
@@ -1329,10 +1333,12 @@ public:
 
 MachObjectWriter::MachObjectWriter(raw_ostream &OS,
                                    bool Is64Bit,
+                                   uint32_t CPUType,
+                                   uint32_t CPUSubtype,
                                    bool IsLittleEndian)
   : MCObjectWriter(OS, IsLittleEndian)
 {
-  Impl = new MachObjectWriterImpl(this, Is64Bit);
+  Impl = new MachObjectWriterImpl(this, Is64Bit, CPUType, CPUSubtype);
 }
 
 MachObjectWriter::~MachObjectWriter() {
index 4be02424752f29ab2d22b954fb762022fb86b794..e1c4524162c34f758966f1abfb690a7afc380101 100644 (file)
@@ -20,6 +20,7 @@
 #include "llvm/MC/MCSectionMachO.h"
 #include "llvm/MC/MachObjectWriter.h"
 #include "llvm/Support/ELF.h"
+#include "llvm/Support/MachO.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/raw_ostream.h"
 #include "llvm/Target/TargetRegistry.h"
@@ -128,7 +129,9 @@ public:
   }
 
   MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
-    return new MachObjectWriter(OS, /*Is64Bit=*/false);
+    // FIXME: Subtarget info should be derived. Force v7 for now.
+    return new MachObjectWriter(OS, /*Is64Bit=*/false, MachO::CPUTypeARM,
+                                MachO::CPUSubType_ARM_V7);
   }
 
   virtual bool doesSectionRequireSymbols(const MCSection &Section) const {
index 687971d114f6ebad195667c2b4e43895ca5f0a61..42643a395a3a7563191b3e544dd0b2c45f52fc65 100644 (file)
@@ -21,6 +21,7 @@
 #include "llvm/MC/MCSectionMachO.h"
 #include "llvm/MC/MachObjectWriter.h"
 #include "llvm/Support/ELF.h"
+#include "llvm/Support/MachO.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/raw_ostream.h"
 #include "llvm/Target/TargetRegistry.h"
@@ -396,7 +397,8 @@ public:
   }
 
   MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
-    return new MachObjectWriter(OS, /*Is64Bit=*/false);
+    return new MachObjectWriter(OS, /*Is64Bit=*/false, MachO::CPUTypeI386,
+                                MachO::CPUSubType_I386_ALL);
   }
 };
 
@@ -412,7 +414,8 @@ public:
   }
 
   MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
-    return new MachObjectWriter(OS, /*Is64Bit=*/true);
+    return new MachObjectWriter(OS, /*Is64Bit=*/true, MachO::CPUTypeX86_64,
+                                MachO::CPUSubType_I386_ALL);
   }
 
   virtual bool doesSectionRequireSymbols(const MCSection &Section) const {