diff options
author | Anton Korobeynikov <asl@math.spbu.ru> | 2012-04-09 13:38:30 +0000 |
---|---|---|
committer | Anton Korobeynikov <asl@math.spbu.ru> | 2012-04-09 13:38:30 +0000 |
commit | e2571793ba6fc13e5525b8d7224812f99842a1a4 (patch) | |
tree | 7f63592995c162e1cf952666e881dab7c83de39d /lib/Driver/Tools.cpp | |
parent | c3cb07205a18d51b0cfff5d431579d5930277ee0 (diff) |
Factor out ARM floating ABI determination to new routine
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@154318 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Driver/Tools.cpp')
-rw-r--r-- | lib/Driver/Tools.cpp | 79 |
1 files changed, 44 insertions, 35 deletions
diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 14842f36e7..8093d2f6df 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -568,41 +568,11 @@ static void addFPMathArgs(const Driver &D, const Arg *A, const ArgList &Args, D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args); } -void Clang::AddARMTargetArgs(const ArgList &Args, - ArgStringList &CmdArgs, - bool KernelOrKext) const { - const Driver &D = getToolChain().getDriver(); - llvm::Triple Triple = getToolChain().getTriple(); - - // Select the ABI to use. - // - // FIXME: Support -meabi. - const char *ABIName = 0; - if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) { - ABIName = A->getValue(Args); - } else { - // Select the default based on the platform. - switch(Triple.getEnvironment()) { - case llvm::Triple::ANDROIDEABI: - case llvm::Triple::GNUEABI: - ABIName = "aapcs-linux"; - break; - case llvm::Triple::EABI: - ABIName = "aapcs"; - break; - default: - ABIName = "apcs-gnu"; - } - } - CmdArgs.push_back("-target-abi"); - CmdArgs.push_back(ABIName); - - // Set the CPU based on -march= and -mcpu=. - CmdArgs.push_back("-target-cpu"); - CmdArgs.push_back(getARMTargetCPU(Args, Triple)); - - // Select the float ABI as determined by -msoft-float, -mhard-float, and - // -mfloat-abi=. +// Select the float ABI as determined by -msoft-float, -mhard-float, and +// -mfloat-abi=. +static StringRef getARMFloatABI(const Driver &D, + const ArgList &Args, + const llvm::Triple &Triple) { StringRef FloatABI; if (Arg *A = Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float, @@ -674,6 +644,45 @@ void Clang::AddARMTargetArgs(const ArgList &Args, } } + return FloatABI; +} + + +void Clang::AddARMTargetArgs(const ArgList &Args, + ArgStringList &CmdArgs, + bool KernelOrKext) const { + const Driver &D = getToolChain().getDriver(); + llvm::Triple Triple = getToolChain().getTriple(); + + // Select the ABI to use. + // + // FIXME: Support -meabi. + const char *ABIName = 0; + if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) { + ABIName = A->getValue(Args); + } else { + // Select the default based on the platform. + switch(Triple.getEnvironment()) { + case llvm::Triple::ANDROIDEABI: + case llvm::Triple::GNUEABI: + ABIName = "aapcs-linux"; + break; + case llvm::Triple::EABI: + ABIName = "aapcs"; + break; + default: + ABIName = "apcs-gnu"; + } + } + CmdArgs.push_back("-target-abi"); + CmdArgs.push_back(ABIName); + + // Set the CPU based on -march= and -mcpu=. + CmdArgs.push_back("-target-cpu"); + CmdArgs.push_back(getARMTargetCPU(Args, Triple)); + + // Determine floating point ABI from the options & target defaults. + StringRef FloatABI = getARMFloatABI(D, Args, Triple); if (FloatABI == "soft") { // Floating point operations and argument passing are soft. // |