1
0
mirror of https://github.com/c64scene-ar/llvm-6502.git synced 2025-03-21 03:32:29 +00:00

Move the TLSModel information into the TargetMachine rather than hiding

in TargetLowering. There was already a FIXME about this location being
odd. The interface is simplified as a consequence. This will also make
it easier to change TLS models when compiling with PIE.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@154292 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chandler Carruth 2012-04-08 17:20:55 +00:00
parent 0f55449246
commit 34797136cb
6 changed files with 37 additions and 35 deletions

@ -27,6 +27,16 @@ namespace llvm {
enum Model { Default, JITDefault, Small, Kernel, Medium, Large };
}
// TLS models.
namespace TLSModel {
enum Model {
GeneralDynamic,
LocalDynamic,
InitialExec,
LocalExec
};
}
// Code generation optimization level.
namespace CodeGenOpt {
enum Level {

@ -64,17 +64,6 @@ namespace llvm {
};
}
// FIXME: should this be here?
namespace TLSModel {
enum Model {
GeneralDynamic,
LocalDynamic,
InitialExec,
LocalExec
};
}
TLSModel::Model getTLSModel(const GlobalValue *GV, Reloc::Model reloc);
//===----------------------------------------------------------------------===//
/// TargetLowering - This class defines information used to lower LLVM code to

@ -24,6 +24,7 @@ namespace llvm {
class InstrItineraryData;
class JITCodeEmitter;
class GlobalValue;
class MCAsmInfo;
class MCCodeGenInfo;
class MCContext;
@ -195,6 +196,10 @@ public:
/// medium, large, and target default.
CodeModel::Model getCodeModel() const;
/// getTLSModel - Returns the TLS model which should be used for the given
/// global variable.
TLSModel::Model getTLSModel(const GlobalValue *GV) const;
/// getOptLevel - Returns the optimization level: None, Less,
/// Default, or Aggressive.
CodeGenOpt::Level getOptLevel() const;

@ -39,28 +39,6 @@ static cl::opt<bool>
AllowPromoteIntElem("promote-elements", cl::Hidden, cl::init(true),
cl::desc("Allow promotion of integer vector element types"));
namespace llvm {
TLSModel::Model getTLSModel(const GlobalValue *GV, Reloc::Model reloc) {
bool isLocal = GV->hasLocalLinkage();
bool isDeclaration = GV->isDeclaration();
// FIXME: what should we do for protected and internal visibility?
// For variables, is internal different from hidden?
bool isHidden = GV->hasHiddenVisibility();
if (reloc == Reloc::PIC_) {
if (isLocal || isHidden)
return TLSModel::LocalDynamic;
else
return TLSModel::GeneralDynamic;
} else {
if (!isDeclaration || isHidden)
return TLSModel::LocalExec;
else
return TLSModel::InitialExec;
}
}
}
/// InitLibcallNames - Set default libcall names.
///
static void InitLibcallNames(const char **Names) {

@ -11,6 +11,7 @@
//
//===----------------------------------------------------------------------===//
#include "llvm/GlobalValue.h"
#include "llvm/MC/MCAsmInfo.h"
#include "llvm/MC/MCCodeGenInfo.h"
#include "llvm/Target/TargetMachine.h"
@ -74,6 +75,26 @@ CodeModel::Model TargetMachine::getCodeModel() const {
return CodeGenInfo->getCodeModel();
}
TLSModel::Model TargetMachine::getTLSModel(const GlobalValue *GV) const {
bool isLocal = GV->hasLocalLinkage();
bool isDeclaration = GV->isDeclaration();
// FIXME: what should we do for protected and internal visibility?
// For variables, is internal different from hidden?
bool isHidden = GV->hasHiddenVisibility();
if (getRelocationModel() == Reloc::PIC_) {
if (isLocal || isHidden)
return TLSModel::LocalDynamic;
else
return TLSModel::GeneralDynamic;
} else {
if (!isDeclaration || isHidden)
return TLSModel::LocalExec;
else
return TLSModel::InitialExec;
}
}
/// getOptLevel - Returns the optimization level: None, Less,
/// Default, or Aggressive.
CodeGenOpt::Level TargetMachine::getOptLevel() const {

@ -7205,8 +7205,7 @@ X86TargetLowering::LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const {
if (const GlobalAlias *GA = dyn_cast<GlobalAlias>(GV))
GV = GA->resolveAliasedGlobal(false);
TLSModel::Model model
= getTLSModel(GV, getTargetMachine().getRelocationModel());
TLSModel::Model model = getTargetMachine().getTLSModel(GV);
switch (model) {
case TLSModel::GeneralDynamic: