Put constant data to .const, .const_data, .literal{4|8|16} sections.

llvm-svn: 35016
This commit is contained in:
Evan Cheng 2007-03-08 01:07:07 +00:00
parent 58aeb9c444
commit 13a1d96963
2 changed files with 25 additions and 2 deletions

View File

@ -145,7 +145,8 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) {
std::string name = Mang->getValueName(I); std::string name = Mang->getValueName(I);
Constant *C = I->getInitializer(); Constant *C = I->getInitializer();
unsigned Size = TD->getTypeSize(C->getType()); const Type *Type = C->getType();
unsigned Size = TD->getTypeSize(Type);
unsigned Align = TD->getPreferredAlignmentLog(I); unsigned Align = TD->getPreferredAlignmentLog(I);
if (I->hasHiddenVisibility()) if (I->hasHiddenVisibility())
@ -250,8 +251,28 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) {
} else { } else {
if (C->isNullValue() && !NoZerosInBSS && TAI->getBSSSection()) if (C->isNullValue() && !NoZerosInBSS && TAI->getBSSSection())
SwitchToDataSection(TAI->getBSSSection(), I); SwitchToDataSection(TAI->getBSSSection(), I);
else else if (!I->isConstant())
SwitchToDataSection(TAI->getDataSection(), I); SwitchToDataSection(TAI->getDataSection(), I);
else {
// Read-only data.
bool isIntFPLiteral = Type->isInteger() || Type->isFloatingPoint();
if (C->ContainsRelocations() && Subtarget->isTargetDarwin() &&
TM.getRelocationModel() != Reloc::Static)
SwitchToDataSection("\t.const_data\n");
else if (isIntFPLiteral && Size == 4 &&
TAI->getFourByteConstantSection())
SwitchToDataSection(TAI->getFourByteConstantSection(), I);
else if (isIntFPLiteral && Size == 8 &&
TAI->getEightByteConstantSection())
SwitchToDataSection(TAI->getEightByteConstantSection(), I);
else if (isIntFPLiteral && Size == 16 &&
TAI->getSixteenByteConstantSection())
SwitchToDataSection(TAI->getSixteenByteConstantSection(), I);
else if (TAI->getReadOnlySection())
SwitchToDataSection(TAI->getReadOnlySection(), I);
else
SwitchToDataSection(TAI->getDataSection(), I);
}
} }
break; break;

View File

@ -56,6 +56,7 @@ X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) {
EightByteConstantSection = "\t.literal8\n"; EightByteConstantSection = "\t.literal8\n";
if (Subtarget->is64Bit()) if (Subtarget->is64Bit())
SixteenByteConstantSection = "\t.literal16\n"; SixteenByteConstantSection = "\t.literal16\n";
ReadOnlySection = "\t.const\n";
LCOMMDirective = "\t.lcomm\t"; LCOMMDirective = "\t.lcomm\t";
COMMDirectiveTakesAlignment = false; COMMDirectiveTakesAlignment = false;
HasDotTypeDotSizeDirective = false; HasDotTypeDotSizeDirective = false;
@ -103,6 +104,7 @@ X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) {
// bool HasDotLoc; // Defaults to false. // bool HasDotLoc; // Defaults to false.
// HasDotFile - True if target asm supports .file directives. // HasDotFile - True if target asm supports .file directives.
// bool HasDotFile; // Defaults to false. // bool HasDotFile; // Defaults to false.
ReadOnlySection = "\t.section\t.rodata\n";
PrivateGlobalPrefix = ".L"; PrivateGlobalPrefix = ".L";
WeakRefDirective = "\t.weak\t"; WeakRefDirective = "\t.weak\t";
DwarfRequiresFrameSection = false; DwarfRequiresFrameSection = false;