diff options
Diffstat (limited to 'lib/Driver/ToolChain.cpp')
| -rw-r--r-- | lib/Driver/ToolChain.cpp | 53 | 
1 files changed, 43 insertions, 10 deletions
diff --git a/lib/Driver/ToolChain.cpp b/lib/Driver/ToolChain.cpp index 2bcfecf6bde61..f7b7402215a6d 100644 --- a/lib/Driver/ToolChain.cpp +++ b/lib/Driver/ToolChain.cpp @@ -26,14 +26,47 @@ using namespace clang::driver;  using namespace clang;  using namespace llvm::opt; +static llvm::opt::Arg *GetRTTIArgument(const ArgList &Args) { +  return Args.getLastArg(options::OPT_mkernel, options::OPT_fapple_kext, +                         options::OPT_fno_rtti, options::OPT_frtti); +} + +static ToolChain::RTTIMode CalculateRTTIMode(const ArgList &Args, +                                             const llvm::Triple &Triple, +                                             const Arg *CachedRTTIArg) { +  // Explicit rtti/no-rtti args +  if (CachedRTTIArg) { +    if (CachedRTTIArg->getOption().matches(options::OPT_frtti)) +      return ToolChain::RM_EnabledExplicitly; +    else +      return ToolChain::RM_DisabledExplicitly; +  } + +  // -frtti is default, except for the PS4 CPU. +  if (!Triple.isPS4CPU()) +    return ToolChain::RM_EnabledImplicitly; + +  // On the PS4, turning on c++ exceptions turns on rtti. +  // We're assuming that, if we see -fexceptions, rtti gets turned on. +  Arg *Exceptions = Args.getLastArgNoClaim( +      options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions, +      options::OPT_fexceptions, options::OPT_fno_exceptions); +  if (Exceptions && +      (Exceptions->getOption().matches(options::OPT_fexceptions) || +       Exceptions->getOption().matches(options::OPT_fcxx_exceptions))) +    return ToolChain::RM_EnabledImplicitly; + +  return ToolChain::RM_DisabledImplicitly; +} +  ToolChain::ToolChain(const Driver &D, const llvm::Triple &T,                       const ArgList &Args) -  : D(D), Triple(T), Args(Args) { +    : D(D), Triple(T), Args(Args), CachedRTTIArg(GetRTTIArgument(Args)), +      CachedRTTIMode(CalculateRTTIMode(Args, Triple, CachedRTTIArg)) {    if (Arg *A = Args.getLastArg(options::OPT_mthread_model))      if (!isThreadModelSupported(A->getValue()))        D.Diag(diag::err_drv_invalid_thread_model_for_target) -          << A->getValue() -          << A->getAsString(Args); +          << A->getValue() << A->getAsString(Args);  }  ToolChain::~ToolChain() { @@ -264,18 +297,18 @@ std::string ToolChain::ComputeLLVMTriple(const ArgList &Args,      // '-mbig-endian'/'-EB'.      if (Arg *A = Args.getLastArg(options::OPT_mlittle_endian,                                   options::OPT_mbig_endian)) { -      if (A->getOption().matches(options::OPT_mlittle_endian)) -        IsBigEndian = false; -      else -        IsBigEndian = true; +      IsBigEndian = !A->getOption().matches(options::OPT_mlittle_endian);      }      // Thumb2 is the default for V7 on Darwin.      //      // FIXME: Thumb should just be another -target-feaure, not in the triple. -    StringRef Suffix = Triple.isOSBinFormatMachO() -      ? tools::arm::getLLVMArchSuffixForARM(tools::arm::getARMCPUForMArch(Args, Triple)) -      : tools::arm::getLLVMArchSuffixForARM(tools::arm::getARMTargetCPU(Args, Triple)); +    StringRef CPU = Triple.isOSBinFormatMachO() +      ? tools::arm::getARMCPUForMArch(Args, Triple) +      : tools::arm::getARMTargetCPU(Args, Triple); +    StringRef Suffix =  +      tools::arm::getLLVMArchSuffixForARM(CPU, +                                          tools::arm::getARMArch(Args, Triple));      bool ThumbDefault = Suffix.startswith("v6m") || Suffix.startswith("v7m") ||        Suffix.startswith("v7em") ||        (Suffix.startswith("v7") && getTriple().isOSBinFormatMachO());  | 
