forked from OSchip/llvm-project
* Fix one more bug in PIC codegen: extra load is needed for *all*
non-statics. * Introduce new option to output zero-initialized data to .bss section. This can reduce size of binaries. Enable it by default for ELF & Cygwin/Mingw targets. Probably, Darwin should be also added. llvm-svn: 33299
This commit is contained in:
parent
38ee6519b7
commit
3f6d52834b
|
@ -38,6 +38,10 @@ namespace llvm {
|
|||
/// DataSection - Section directive for standard data.
|
||||
///
|
||||
const char *DataSection; // Defaults to ".data".
|
||||
|
||||
/// BSSSection - Section directive for uninitialized data.
|
||||
///
|
||||
const char *BSSSection; // Default to ".bss".
|
||||
|
||||
/// AddressSize - Size of addresses used in file.
|
||||
///
|
||||
|
@ -313,6 +317,9 @@ namespace llvm {
|
|||
const char *getDataSection() const {
|
||||
return DataSection;
|
||||
}
|
||||
const char *getBSSSection() const {
|
||||
return BSSSection;
|
||||
}
|
||||
unsigned getAddressSize() const {
|
||||
return AddressSize;
|
||||
}
|
||||
|
|
|
@ -54,6 +54,8 @@ namespace llvm {
|
|||
/// generate libcalls to the software floating point library instead of
|
||||
/// target FP instructions.
|
||||
extern bool UseSoftFloat;
|
||||
|
||||
extern bool NoZerosInBSS;
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
||||
|
|
|
@ -19,6 +19,7 @@ using namespace llvm;
|
|||
TargetAsmInfo::TargetAsmInfo() :
|
||||
TextSection(".text"),
|
||||
DataSection(".data"),
|
||||
BSSSection(".bss"),
|
||||
AddressSize(4),
|
||||
NeedsSet(false),
|
||||
MaxInstLength(4),
|
||||
|
|
|
@ -28,6 +28,7 @@ namespace llvm {
|
|||
bool UnsafeFPMath;
|
||||
bool FiniteOnlyFPMathOption;
|
||||
bool UseSoftFloat;
|
||||
bool NoZerosInBSS;
|
||||
Reloc::Model RelocationModel;
|
||||
CodeModel::Model CMModel;
|
||||
}
|
||||
|
@ -61,6 +62,11 @@ namespace {
|
|||
cl::desc("Generate software floating point library calls"),
|
||||
cl::location(UseSoftFloat),
|
||||
cl::init(false));
|
||||
cl::opt<bool, true>
|
||||
DontPlaceZerosInBSS("nozero-initialized-in-bss",
|
||||
cl::desc("Don't place zero-initialized symbols into bss section"),
|
||||
cl::location(NoZerosInBSS),
|
||||
cl::init(false));
|
||||
|
||||
cl::opt<llvm::Reloc::Model, true>
|
||||
DefRelocationModel(
|
||||
|
|
|
@ -323,22 +323,19 @@ void X86ATTAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo,
|
|||
O << Offset;
|
||||
|
||||
if (isMemOp) {
|
||||
if (isExt) {
|
||||
if (Subtarget->isPICStyleGOT()) {
|
||||
if (Subtarget->isPICStyleGOT()) {
|
||||
if (Subtarget->GVRequiresExtraLoad(GV, TM, false))
|
||||
O << "@GOT";
|
||||
} else if (Subtarget->isPICStyleRIPRel()) {
|
||||
O << "@GOTPCREL(%rip)";
|
||||
} else if (Subtarget->is64Bit() && !NotRIPRel)
|
||||
// Use rip when possible to reduce code size, except when
|
||||
// index or base register are also part of the address. e.g.
|
||||
// foo(%rip)(%rcx,%rax,4) is not legal
|
||||
O << "(%rip)";
|
||||
} else {
|
||||
if (Subtarget->is64Bit() && !NotRIPRel)
|
||||
O << "(%rip)";
|
||||
else if (Subtarget->isPICStyleGOT())
|
||||
else
|
||||
O << "@GOTOFF";
|
||||
}
|
||||
} else
|
||||
if (isExt && Subtarget->isPICStyleRIPRel())
|
||||
O << "@GOTPCREL(%rip)";
|
||||
else if (Subtarget->is64Bit() && !NotRIPRel)
|
||||
// Use rip when possible to reduce code size, except when
|
||||
// index or base register are also part of the address. e.g.
|
||||
// foo(%rip)(%rcx,%rax,4) is not legal
|
||||
O << "(%rip)";
|
||||
}
|
||||
|
||||
return;
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#include "llvm/Assembly/Writer.h"
|
||||
#include "llvm/Support/Mangler.h"
|
||||
#include "llvm/Target/TargetAsmInfo.h"
|
||||
#include "llvm/Target/TargetOptions.h"
|
||||
using namespace llvm;
|
||||
|
||||
static X86FunctionInfo calculateFunctionInfo(const Function *F,
|
||||
|
@ -149,7 +150,10 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) {
|
|||
O << "\t.zerofill __DATA__, __common, " << name << ", "
|
||||
<< Size << ", " << Align;
|
||||
} else {
|
||||
SwitchToDataSection(TAI->getDataSection(), I);
|
||||
if (!NoZerosInBSS && TAI->getBSSSection())
|
||||
SwitchToDataSection(TAI->getBSSSection(), I);
|
||||
else
|
||||
SwitchToDataSection(TAI->getDataSection(), I);
|
||||
if (TAI->getLCOMMDirective() != NULL) {
|
||||
if (I->hasInternalLinkage()) {
|
||||
O << TAI->getLCOMMDirective() << name << "," << Size;
|
||||
|
@ -224,7 +228,10 @@ bool X86SharedAsmPrinter::doFinalization(Module &M) {
|
|||
|
||||
SwitchToDataSection(SectionName.c_str());
|
||||
} else {
|
||||
SwitchToDataSection(TAI->getDataSection(), I);
|
||||
if (C->isNullValue() && !NoZerosInBSS && TAI->getBSSSection())
|
||||
SwitchToDataSection(TAI->getBSSSection(), I);
|
||||
else
|
||||
SwitchToDataSection(TAI->getDataSection(), I);
|
||||
}
|
||||
|
||||
break;
|
||||
|
|
|
@ -36,10 +36,14 @@ bool X86Subtarget::GVRequiresExtraLoad(const GlobalValue* GV,
|
|||
bool isDirectCall) const
|
||||
{
|
||||
if (TM.getRelocationModel() != Reloc::Static)
|
||||
if (isTargetDarwin() || isPICStyleGOT()) {
|
||||
if (isTargetDarwin()) {
|
||||
return (!isDirectCall &&
|
||||
(GV->hasWeakLinkage() || GV->hasLinkOnceLinkage() ||
|
||||
(GV->isExternal() && !GV->hasNotBeenReadFromBytecode())));
|
||||
} else if (isPICStyleGOT()) {
|
||||
// Extra load is needed for all non-statics.
|
||||
return (!isDirectCall &&
|
||||
(GV->isExternal() || !GV->hasInternalLinkage()));
|
||||
} else if (isTargetCygMing() || isTargetWindows()) {
|
||||
return (GV->hasDLLImportLinkage());
|
||||
}
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
; RUN: llvm-as < %s | llc -mtriple=i686-pc-linux-gnu -relocation-model=pic &&
|
||||
; RUN: llvm-as < %s | llc -mtriple=i686-pc-linux-gnu -relocation-model=pic | grep _GLOBAL_OFFSET_TABLE_ &&
|
||||
; RUN: llvm-as < %s | llc -mtriple=i686-pc-linux-gnu -relocation-model=pic | grep piclabel | wc -l | grep 3 &&
|
||||
; RUN: llvm-as < %s | llc -mtriple=i686-pc-linux-gnu -relocation-model=pic | grep GOT | wc -l | grep 3
|
||||
|
||||
%ptr = global i32* null
|
||||
%dst = global i32 0
|
||||
%src = global i32 0
|
||||
|
||||
define void %foo() {
|
||||
entry:
|
||||
store i32* %dst, i32** %ptr
|
||||
%tmp.s = load i32* %src
|
||||
store i32 %tmp.s, i32* %dst
|
||||
ret void
|
||||
}
|
||||
|
Loading…
Reference in New Issue