Fixed call stack alignment. Improved AsmPrinter alignment issues.
authorBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Tue, 15 Jul 2008 02:03:36 +0000 (02:03 +0000)
committerBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Tue, 15 Jul 2008 02:03:36 +0000 (02:03 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53585 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/Mips/MipsAsmPrinter.cpp
lib/Target/Mips/MipsISelLowering.cpp
lib/Target/Mips/MipsRegisterInfo.cpp
lib/Target/Mips/MipsTargetAsmInfo.cpp
lib/Target/Mips/MipsTargetMachine.cpp

index d2288e61a07f6db8db495685c5b6240a32f1f34f..d37d08748300495f10f4b9f36178387b78393f3a 100644 (file)
@@ -486,9 +486,24 @@ doFinalization(Module &M)
       
       O << "\n\n";
       std::string name = Mang->getValueName(I);
-      Constant *C      = I->getInitializer();
-      unsigned Size    = TD->getABITypeSize(C->getType());
-      unsigned Align   = TD->getPreferredAlignmentLog(I);
+      Constant *C = I->getInitializer();
+      const Type *CTy = C->getType();
+      unsigned Size = TD->getABITypeSize(CTy);
+      bool printSizeAndType = true;
+
+      // A data structure or array is aligned in memory to the largest 
+      // alignment boundary required by any data type inside it (this matches
+      // the Preferred Type Alignment). For integral types, the alignment is 
+      // the type size. 
+      //unsigned Align = TD->getPreferredAlignmentLog(I);
+      //unsigned Align = TD->getPrefTypeAlignment(C->getType());
+      unsigned Align;
+      if (CTy->getTypeID() == Type::IntegerTyID || 
+          CTy->getTypeID() == Type::VoidTyID) {
+        assert(!(Size & (Size-1)) && "Alignment is not a power of two!");
+        Align = Log2_32(Size);
+      } else
+        Align = TD->getPreferredTypeAlignmentShift(CTy);
 
       // Is this correct ?
       if (C->isNullValue() && (I->hasLinkOnceLinkage() || 
@@ -549,10 +564,20 @@ doFinalization(Module &M)
               else if (!I->isConstant())
                 SwitchToDataSection(TAI->getDataSection(), I);
               else {
-                // Read-only data.
-                if (TAI->getReadOnlySection())
+                // Read-only data. We have two possible scenary here
+                // 1) Readonly section for strings (char arrays).
+                // 2) for other types.
+                if (TAI->getReadOnlySection()) {
+                  const ConstantArray *CVA = dyn_cast<ConstantArray>(C);
+                  if (CVA && CVA->isString()) {
+                      std::string SectionName = "\t.section\t.rodata.str1.4,"
+                                                "\"aMS\",@progbits,1";
+                      SwitchToDataSection(SectionName.c_str());
+                      printSizeAndType = false;
+                      break;
+                  }
                   SwitchToDataSection(TAI->getReadOnlySection(), I);
-                else
+                else
                   SwitchToDataSection(TAI->getDataSection(), I);
               }
             }
@@ -568,17 +593,18 @@ doFinalization(Module &M)
             abort();
           default:
             assert(0 && "Unknown linkage type!");          
-        }
+        } 
 
-        O << "\t.align " << Align << "\n";
+        if (Align)
+          O << "\t.align " << Align << "\n";
 
-        if (TAI->hasDotTypeDotSizeDirective()) {
+        if (TAI->hasDotTypeDotSizeDirective() && printSizeAndType) {
           O << "\t.type " << name << ",@object\n";
           O << "\t.size " << name << "," << Size << "\n";
         }
         O << name << ":\n";
         EmitGlobalConstant(C);
-    }
+    } 
   }
 
   O << "\n";
index 8efba8e734f7bafd815efdbed6663509cf90042e..efc5d9bf8d62c62bc6e54fbdb7dbaecb2b1783bd 100644 (file)
@@ -370,10 +370,12 @@ LowerCCCCallTo(SDOperand Op, SelectionDAG &DAG, unsigned CC)
   SmallVector<CCValAssign, 16> ArgLocs;
   CCState CCInfo(CC, isVarArg, getTargetMachine(), ArgLocs);
 
-  // To meet ABI, Mips must always allocate 16 bytes on
+  // To meet O32 ABI, Mips must always allocate 16 bytes on
   // the stack (even if less than 4 are used as arguments)
-  int VTsize = MVT(MVT::i32).getSizeInBits()/8;
-  MFI->CreateFixedObject(VTsize, (VTsize*3));
+  if (Subtarget->isABI_O32()) {
+    int VTsize = MVT(MVT::i32).getSizeInBits()/8;
+    MFI->CreateFixedObject(VTsize, (VTsize*3));
+  }
 
   CCInfo.AnalyzeCallOperands(Op.Val, CC_Mips);
   
index cd42abd3003ec7a4ef3a4547c7002574e5be92a2..2c92060be905cf34d09ae04611750117d38a58c0 100644 (file)
@@ -267,7 +267,7 @@ emitPrologue(MachineFunction &MF) const
   #endif
 
   // No need to allocate space on the stack.
-  if (NumBytes == 0) return;
+  if (NumBytes == 0 && !MFI->hasCalls()) return;
 
   int FPOffset, RAOffset;
   
@@ -389,7 +389,8 @@ void MipsRegisterInfo::
 processFunctionBeforeFrameFinalized(MachineFunction &MF) const {
   // Set the SPOffset on the FI where GP must be saved/loaded.
   MachineFrameInfo *MFI = MF.getFrameInfo();
-  if (MFI->hasCalls()) { 
+  bool isPIC = (MF.getTarget().getRelocationModel() == Reloc::PIC_);
+  if (MFI->hasCalls() && isPIC) { 
     MipsFunctionInfo *MipsFI = MF.getInfo<MipsFunctionInfo>();
     #ifndef NDEBUG
     DOUT << "processFunctionBeforeFrameFinalized\n";
index a4e13f5f3458a32339d41bfd251838d8ca366742..daed29da914938dbbb366543c4d21987bd279c44 100644 (file)
@@ -31,7 +31,7 @@ MipsTargetAsmInfo::MipsTargetAsmInfo(const MipsTargetMachine &TM) {
   BSSSection                  = "\t.section\t.bss";
   LCOMMDirective              = "\t.lcomm\t";
 
-  if (TM.getRelocationModel() == Reloc::Static)
+  if (!TM.getSubtarget<MipsSubtarget>().hasABICall())
     JumpTableDirective = "\t.word\t";
   else    
     JumpTableDirective = "\t.gpword\t";
index bc4a2a1dfc1235f27dd74de82f6b426b326790f7..a13af313a08908fbbb01aed67fe9ac26765ac373 100644 (file)
@@ -38,8 +38,8 @@ createTargetAsmInfo() const
 MipsTargetMachine::
 MipsTargetMachine(const Module &M, const std::string &FS, bool isLittle=false):
   Subtarget(*this, M, FS, isLittle), 
-  DataLayout(isLittle ? std::string("e-p:32:32:32") :
-                        std::string("E-p:32:32:32")), 
+  DataLayout(isLittle ? std::string("e-p:32:32:32-i8:8:32-i16:16:32") :
+                        std::string("E-p:32:32:32-i8:8:32-i16:16:32")), 
   InstrInfo(*this), 
   FrameInfo(TargetFrameInfo::StackGrowsUp, 8, 0),
   TLInfo(*this)