From f0b5d56efdb4f130c8abe7ac2732a3ff9a66e455 Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Thu, 8 Mar 2007 01:07:07 +0000 Subject: [PATCH] Put constant data to .const, .const_data, .literal{4|8|16} sections. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35016 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86AsmPrinter.cpp | 25 +++++++++++++++++++++++-- lib/Target/X86/X86TargetAsmInfo.cpp | 2 ++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/lib/Target/X86/X86AsmPrinter.cpp b/lib/Target/X86/X86AsmPrinter.cpp index 75003e6b748..ad9a1e8e9f0 100644 --- a/lib/Target/X86/X86AsmPrinter.cpp +++ b/lib/Target/X86/X86AsmPrinter.cpp @@ -145,7 +145,8 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) { std::string name = Mang->getValueName(I); 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); if (I->hasHiddenVisibility()) @@ -250,8 +251,28 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) { } else { if (C->isNullValue() && !NoZerosInBSS && TAI->getBSSSection()) SwitchToDataSection(TAI->getBSSSection(), I); - else + else if (!I->isConstant()) 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; diff --git a/lib/Target/X86/X86TargetAsmInfo.cpp b/lib/Target/X86/X86TargetAsmInfo.cpp index c66862aec62..74977dfa5bf 100644 --- a/lib/Target/X86/X86TargetAsmInfo.cpp +++ b/lib/Target/X86/X86TargetAsmInfo.cpp @@ -56,6 +56,7 @@ X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) { EightByteConstantSection = "\t.literal8\n"; if (Subtarget->is64Bit()) SixteenByteConstantSection = "\t.literal16\n"; + ReadOnlySection = "\t.const\n"; LCOMMDirective = "\t.lcomm\t"; COMMDirectiveTakesAlignment = false; HasDotTypeDotSizeDirective = false; @@ -103,6 +104,7 @@ X86TargetAsmInfo::X86TargetAsmInfo(const X86TargetMachine &TM) { // bool HasDotLoc; // Defaults to false. // HasDotFile - True if target asm supports .file directives. // bool HasDotFile; // Defaults to false. + ReadOnlySection = "\t.section\t.rodata\n"; PrivateGlobalPrefix = ".L"; WeakRefDirective = "\t.weak\t"; DwarfRequiresFrameSection = false;