1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 03:33:20 +01:00

Fixed call stack alignment. Improved AsmPrinter alignment issues.

llvm-svn: 53585
This commit is contained in:
Bruno Cardoso Lopes 2008-07-15 02:03:36 +00:00
parent da53eaaea8
commit 0c154df07f
5 changed files with 47 additions and 18 deletions

View 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";

View 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);

View 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";

View 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";

View 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)