From b27cb55923024907f7dba43d24ec37408ef1f574 Mon Sep 17 00:00:00 2001 From: Bruno Cardoso Lopes Date: Tue, 15 Jul 2008 02:03:36 +0000 Subject: [PATCH] Fixed call stack alignment. Improved AsmPrinter alignment issues. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53585 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/Mips/MipsAsmPrinter.cpp | 46 +++++++++++++++++++++------ lib/Target/Mips/MipsISelLowering.cpp | 8 +++-- lib/Target/Mips/MipsRegisterInfo.cpp | 5 +-- lib/Target/Mips/MipsTargetAsmInfo.cpp | 2 +- lib/Target/Mips/MipsTargetMachine.cpp | 4 +-- 5 files changed, 47 insertions(+), 18 deletions(-) diff --git a/lib/Target/Mips/MipsAsmPrinter.cpp b/lib/Target/Mips/MipsAsmPrinter.cpp index d2288e61a07..d37d0874830 100644 --- a/lib/Target/Mips/MipsAsmPrinter.cpp +++ b/lib/Target/Mips/MipsAsmPrinter.cpp @@ -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(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"; diff --git a/lib/Target/Mips/MipsISelLowering.cpp b/lib/Target/Mips/MipsISelLowering.cpp index 8efba8e734f..efc5d9bf8d6 100644 --- a/lib/Target/Mips/MipsISelLowering.cpp +++ b/lib/Target/Mips/MipsISelLowering.cpp @@ -370,10 +370,12 @@ LowerCCCCallTo(SDOperand Op, SelectionDAG &DAG, unsigned CC) SmallVector 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); diff --git a/lib/Target/Mips/MipsRegisterInfo.cpp b/lib/Target/Mips/MipsRegisterInfo.cpp index cd42abd3003..2c92060be90 100644 --- a/lib/Target/Mips/MipsRegisterInfo.cpp +++ b/lib/Target/Mips/MipsRegisterInfo.cpp @@ -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(); #ifndef NDEBUG DOUT << "processFunctionBeforeFrameFinalized\n"; diff --git a/lib/Target/Mips/MipsTargetAsmInfo.cpp b/lib/Target/Mips/MipsTargetAsmInfo.cpp index a4e13f5f345..daed29da914 100644 --- a/lib/Target/Mips/MipsTargetAsmInfo.cpp +++ b/lib/Target/Mips/MipsTargetAsmInfo.cpp @@ -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().hasABICall()) JumpTableDirective = "\t.word\t"; else JumpTableDirective = "\t.gpword\t"; diff --git a/lib/Target/Mips/MipsTargetMachine.cpp b/lib/Target/Mips/MipsTargetMachine.cpp index bc4a2a1dfc1..a13af313a08 100644 --- a/lib/Target/Mips/MipsTargetMachine.cpp +++ b/lib/Target/Mips/MipsTargetMachine.cpp @@ -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) -- 2.34.1