aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruno Cardoso Lopes <bruno.cardoso@gmail.com>2008-07-15 02:03:36 +0000
committerBruno Cardoso Lopes <bruno.cardoso@gmail.com>2008-07-15 02:03:36 +0000
commitb27cb55923024907f7dba43d24ec37408ef1f574 (patch)
treec77fda314cd514d17598392ceccd52f41e17465f
parentf0d286b77fe40017192b527e5cc5d87974093d54 (diff)
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
-rw-r--r--lib/Target/Mips/MipsAsmPrinter.cpp46
-rw-r--r--lib/Target/Mips/MipsISelLowering.cpp8
-rw-r--r--lib/Target/Mips/MipsRegisterInfo.cpp5
-rw-r--r--lib/Target/Mips/MipsTargetAsmInfo.cpp2
-rw-r--r--lib/Target/Mips/MipsTargetMachine.cpp4
5 files changed, 47 insertions, 18 deletions
diff --git a/lib/Target/Mips/MipsAsmPrinter.cpp b/lib/Target/Mips/MipsAsmPrinter.cpp
index d2288e61a0..d37d087483 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<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";
diff --git a/lib/Target/Mips/MipsISelLowering.cpp b/lib/Target/Mips/MipsISelLowering.cpp
index 8efba8e734..efc5d9bf8d 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<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);
diff --git a/lib/Target/Mips/MipsRegisterInfo.cpp b/lib/Target/Mips/MipsRegisterInfo.cpp
index cd42abd300..2c92060be9 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<MipsFunctionInfo>();
#ifndef NDEBUG
DOUT << "processFunctionBeforeFrameFinalized\n";
diff --git a/lib/Target/Mips/MipsTargetAsmInfo.cpp b/lib/Target/Mips/MipsTargetAsmInfo.cpp
index a4e13f5f34..daed29da91 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<MipsSubtarget>().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 bc4a2a1dfc..a13af313a0 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)