Refactor TargetMachine, pushing handling of TargetData into the target-specific subclasses.  This has one caller-visible change: getTargetData() now returns a pointer instead of a reference.

This fixes PR 759.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28074 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/PowerPC/PPCAsmPrinter.cpp b/lib/Target/PowerPC/PPCAsmPrinter.cpp
index f3a0311..cfcf4df 100644
--- a/lib/Target/PowerPC/PPCAsmPrinter.cpp
+++ b/lib/Target/PowerPC/PPCAsmPrinter.cpp
@@ -582,7 +582,7 @@
 }
 
 bool DarwinAsmPrinter::doFinalization(Module &M) {
-  const TargetData &TD = TM.getTargetData();
+  const TargetData *TD = TM.getTargetData();
 
   // Print out module-level global variables here.
   for (Module::const_global_iterator I = M.global_begin(), E = M.global_end();
@@ -595,7 +595,7 @@
     
     std::string name = Mang->getValueName(I);
     Constant *C = I->getInitializer();
-    unsigned Size = TD.getTypeSize(C->getType());
+    unsigned Size = TD->getTypeSize(C->getType());
     unsigned Align = getPreferredAlignmentLog(I);
 
     if (C->isNullValue() && /* FIXME: Verify correct */
@@ -761,7 +761,7 @@
 
 bool AIXAsmPrinter::doInitialization(Module &M) {
   SwitchSection("", 0);
-  const TargetData &TD = TM.getTargetData();
+  const TargetData *TD = TM.getTargetData();
 
   O << "\t.machine \"ppc64\"\n"
     << "\t.toc\n"
@@ -810,7 +810,7 @@
 }
 
 bool AIXAsmPrinter::doFinalization(Module &M) {
-  const TargetData &TD = TM.getTargetData();
+  const TargetData *TD = TM.getTargetData();
   // Print out module-level global variables
   for (Module::const_global_iterator I = M.global_begin(), E = M.global_end();
        I != E; ++I) {
@@ -821,8 +821,8 @@
     if (I->hasInternalLinkage()) {
       O << "\t.lcomm " << Name << ",16,_global.bss_c";
     } else {
-      O << "\t.comm " << Name << "," << TD.getTypeSize(I->getType())
-        << "," << Log2_32((unsigned)TD.getTypeAlignment(I->getType()));
+      O << "\t.comm " << Name << "," << TD->getTypeSize(I->getType())
+        << "," << Log2_32((unsigned)TD->getTypeAlignment(I->getType()));
     }
     O << "\t\t" << CommentString << " ";
     WriteAsOperand(O, I, false, true, &M);
diff --git a/lib/Target/PowerPC/PPCTargetMachine.cpp b/lib/Target/PowerPC/PPCTargetMachine.cpp
index d35ceb1..fd9df20 100644
--- a/lib/Target/PowerPC/PPCTargetMachine.cpp
+++ b/lib/Target/PowerPC/PPCTargetMachine.cpp
@@ -58,7 +58,8 @@
 }
 
 PPCTargetMachine::PPCTargetMachine(const Module &M, const std::string &FS)
-: TargetMachine("PowerPC", false, 4, 4, 4, 4, 4, 4, 2, 1, 1),
+: TargetMachine("PowerPC"),
+  DataLayout("PowerPC", false, 4, 4, 4, 4, 4),
   Subtarget(M, FS), FrameInfo(*this, false), JITInfo(*this),
   TLInfo(*this), InstrItins(Subtarget.getInstrItineraryData()) {
   if (TargetDefault == PPCTarget) {
diff --git a/lib/Target/PowerPC/PPCTargetMachine.h b/lib/Target/PowerPC/PPCTargetMachine.h
index 3b2e481..e4893a8 100644
--- a/lib/Target/PowerPC/PPCTargetMachine.h
+++ b/lib/Target/PowerPC/PPCTargetMachine.h
@@ -26,6 +26,7 @@
 class GlobalValue;
 
 class PPCTargetMachine : public TargetMachine {
+  const TargetData DataLayout;       // Calculates type size & alignment
   PPCInstrInfo           InstrInfo;
   PPCSubtarget           Subtarget;
   PPCFrameInfo           FrameInfo;
@@ -43,6 +44,7 @@
   virtual const MRegisterInfo    *getRegisterInfo() const {
     return &InstrInfo.getRegisterInfo();
   }
+  virtual const TargetData       *getTargetData() const { return &DataLayout; }
   virtual const InstrItineraryData getInstrItineraryData() const {  
     return InstrItins;
   }