diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2014-11-24 17:02:24 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2014-11-24 17:02:24 +0000 | 
| commit | 91bc56ed825ba56b3cc264aa5c95ab84f86832ab (patch) | |
| tree | 4df130b28021d86e13bf4565ef58c1c5a5e093b4 /contrib/llvm/lib/Target/TargetMachine.cpp | |
| parent | 9efc7e72bb1daf5d6019871d9c93a1c488a11229 (diff) | |
| parent | 5ca98fd98791947eba83a1ed3f2c8191ef7afa6c (diff) | |
Notes
Diffstat (limited to 'contrib/llvm/lib/Target/TargetMachine.cpp')
| -rw-r--r-- | contrib/llvm/lib/Target/TargetMachine.cpp | 98 | 
1 files changed, 51 insertions, 47 deletions
| diff --git a/contrib/llvm/lib/Target/TargetMachine.cpp b/contrib/llvm/lib/Target/TargetMachine.cpp index cb42e8311b87..95c8cb66f402 100644 --- a/contrib/llvm/lib/Target/TargetMachine.cpp +++ b/contrib/llvm/lib/Target/TargetMachine.cpp @@ -17,30 +17,18 @@  #include "llvm/IR/GlobalAlias.h"  #include "llvm/IR/GlobalValue.h"  #include "llvm/IR/GlobalVariable.h" +#include "llvm/IR/Mangler.h"  #include "llvm/MC/MCAsmInfo.h"  #include "llvm/MC/MCCodeGenInfo.h" +#include "llvm/MC/MCContext.h" +#include "llvm/MC/MCTargetOptions.h" +#include "llvm/MC/SectionKind.h"  #include "llvm/Support/CommandLine.h" +#include "llvm/Target/TargetLowering.h" +#include "llvm/Target/TargetLoweringObjectFile.h"  using namespace llvm;  //--------------------------------------------------------------------------- -// Command-line options that tend to be useful on more than one back-end. -// - -namespace llvm { -  bool HasDivModLibcall; -  bool AsmVerbosityDefault(false); -} - -static cl::opt<bool> -DataSections("fdata-sections", -  cl::desc("Emit data into separate sections"), -  cl::init(false)); -static cl::opt<bool> -FunctionSections("ffunction-sections", -  cl::desc("Emit functions into separate sections"), -  cl::init(false)); - -//---------------------------------------------------------------------------  // TargetMachine Class  // @@ -48,13 +36,8 @@ TargetMachine::TargetMachine(const Target &T,                               StringRef TT, StringRef CPU, StringRef FS,                               const TargetOptions &Options)    : TheTarget(T), TargetTriple(TT), TargetCPU(CPU), TargetFS(FS), -    CodeGenInfo(0), AsmInfo(0), -    MCRelaxAll(false), -    MCNoExecStack(false), -    MCSaveTempLabels(false), -    MCUseLoc(true), -    MCUseCFI(true), -    MCUseDwarfDirectory(false), +    CodeGenInfo(nullptr), AsmInfo(nullptr), +    RequireStructuredCFG(false),      Options(Options) {  } @@ -67,7 +50,7 @@ TargetMachine::~TargetMachine() {  void TargetMachine::resetTargetOptions(const MachineFunction *MF) const {    const Function *F = MF->getFunction();    TargetOptions &TO = MF->getTarget().Options; -   +  #define RESET_OPTION(X, Y)                                              \    do {                                                                  \      if (F->hasFnAttribute(Y))                                           \ @@ -84,6 +67,8 @@ void TargetMachine::resetTargetOptions(const MachineFunction *MF) const {    RESET_OPTION(NoNaNsFPMath, "no-nans-fp-math");    RESET_OPTION(UseSoftFloat, "use-soft-float");    RESET_OPTION(DisableTailCalls, "disable-tail-calls"); + +  TO.MCOptions.SanitizeAddress = F->hasFnAttribute(Attribute::SanitizeAddress);  }  /// getRelocationModel - Returns the code generation relocation model. The @@ -103,8 +88,8 @@ CodeModel::Model TargetMachine::getCodeModel() const {  }  /// Get the IR-specified TLS model for Var. -static TLSModel::Model getSelectedTLSModel(const GlobalVariable *Var) { -  switch (Var->getThreadLocalMode()) { +static TLSModel::Model getSelectedTLSModel(const GlobalValue *GV) { +  switch (GV->getThreadLocalMode()) {    case GlobalVariable::NotThreadLocal:      llvm_unreachable("getSelectedTLSModel for non-TLS variable");      break; @@ -121,19 +106,13 @@ static TLSModel::Model getSelectedTLSModel(const GlobalVariable *Var) {  }  TLSModel::Model TargetMachine::getTLSModel(const GlobalValue *GV) const { -  // If GV is an alias then use the aliasee for determining -  // thread-localness. -  if (const GlobalAlias *GA = dyn_cast<GlobalAlias>(GV)) -    GV = GA->resolveAliasedGlobal(false); -  const GlobalVariable *Var = cast<GlobalVariable>(GV); - -  bool isLocal = Var->hasLocalLinkage(); -  bool isDeclaration = Var->isDeclaration(); +  bool isLocal = GV->hasLocalLinkage(); +  bool isDeclaration = GV->isDeclaration();    bool isPIC = getRelocationModel() == Reloc::PIC_;    bool isPIE = Options.PositionIndependentExecutable;    // FIXME: what should we do for protected and internal visibility?    // For variables, is internal different from hidden? -  bool isHidden = Var->hasHiddenVisibility(); +  bool isHidden = GV->hasHiddenVisibility();    TLSModel::Model Model;    if (isPIC && !isPIE) { @@ -149,7 +128,7 @@ TLSModel::Model TargetMachine::getTLSModel(const GlobalValue *GV) const {    }    // If the user specified a more specific model, use that. -  TLSModel::Model SelectedModel = getSelectedTLSModel(Var); +  TLSModel::Model SelectedModel = getSelectedTLSModel(GV);    if (SelectedModel > Model)      return SelectedModel; @@ -169,26 +148,51 @@ void TargetMachine::setOptLevel(CodeGenOpt::Level Level) const {      CodeGenInfo->setOptLevel(Level);  } -bool TargetMachine::getAsmVerbosityDefault() { -  return AsmVerbosityDefault; +bool TargetMachine::getAsmVerbosityDefault() const { +  return Options.MCOptions.AsmVerbose;  }  void TargetMachine::setAsmVerbosityDefault(bool V) { -  AsmVerbosityDefault = V; +  Options.MCOptions.AsmVerbose = V;  } -bool TargetMachine::getFunctionSections() { -  return FunctionSections; +bool TargetMachine::getFunctionSections() const { +  return Options.FunctionSections;  } -bool TargetMachine::getDataSections() { -  return DataSections; +bool TargetMachine::getDataSections() const { +  return Options.DataSections;  }  void TargetMachine::setFunctionSections(bool V) { -  FunctionSections = V; +  Options.FunctionSections = V;  }  void TargetMachine::setDataSections(bool V) { -  DataSections = V; +  Options.DataSections = V; +} + +void TargetMachine::getNameWithPrefix(SmallVectorImpl<char> &Name, +                                      const GlobalValue *GV, Mangler &Mang, +                                      bool MayAlwaysUsePrivate) const { +  if (MayAlwaysUsePrivate || !GV->hasPrivateLinkage()) { +    // Simple case: If GV is not private, it is not important to find out if +    // private labels are legal in this case or not. +    Mang.getNameWithPrefix(Name, GV, false); +    return; +  } +  SectionKind GVKind = TargetLoweringObjectFile::getKindForGlobal(GV, *this); +  const TargetLoweringObjectFile &TLOF = +      getTargetLowering()->getObjFileLowering(); +  const MCSection *TheSection = TLOF.SectionForGlobal(GV, GVKind, Mang, *this); +  bool CannotUsePrivateLabel = TLOF.isSectionAtomizableBySymbols(*TheSection); +  Mang.getNameWithPrefix(Name, GV, CannotUsePrivateLabel); +} + +MCSymbol *TargetMachine::getSymbol(const GlobalValue *GV, Mangler &Mang) const { +  SmallString<60> NameStr; +  getNameWithPrefix(NameStr, GV, Mang); +  const TargetLoweringObjectFile &TLOF = +      getTargetLowering()->getObjFileLowering(); +  return TLOF.getContext().GetOrCreateSymbol(NameStr.str());  } | 
