Author: rengolin Date: Mon Nov 9 06:40:41 2015 New Revision: 252463 URL: http://llvm.org/viewvc/llvm-project?rev=252463&view=rev Log: [EABI] Add Clang support for -meabi flag
The -meabi flag to control LLVM EABI version. Without '-meabi' or with '-meabi default' imply LLVM triple default. With '-meabi gnu' sets EABI GNU. With '-meabi 4' or '-meabi 5' set EABI version 4 and 5 respectively. A similar patch was introduced in LLVM. Patch by Vinicius Tinti. Added: cfe/trunk/test/CodeGen/arm-eabi.c cfe/trunk/test/Driver/eabi.c Modified: cfe/trunk/include/clang/Driver/Options.td cfe/trunk/include/clang/Frontend/CodeGenOptions.h cfe/trunk/lib/CodeGen/BackendUtil.cpp cfe/trunk/lib/Driver/Tools.cpp cfe/trunk/lib/Frontend/CompilerInvocation.cpp Modified: cfe/trunk/include/clang/Driver/Options.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=252463&r1=252462&r2=252463&view=diff ============================================================================== --- cfe/trunk/include/clang/Driver/Options.td (original) +++ cfe/trunk/include/clang/Driver/Options.td Mon Nov 9 06:40:41 2015 @@ -1281,6 +1281,8 @@ def mstack_probe_size : Joined<["-"], "m HelpText<"Set the stack probe size">; def mthread_model : Separate<["-"], "mthread-model">, Group<m_Group>, Flags<[CC1Option]>, HelpText<"The thread model to use, e.g. posix, single (posix by default)">; +def meabi : Separate<["-"], "meabi">, Group<m_Group>, Flags<[CC1Option]>, + HelpText<"Set EABI type, e.g. 4, 5 or gnu (default depends on triple)">; def mmmx : Flag<["-"], "mmmx">, Group<m_x86_Features_Group>; def mno_3dnowa : Flag<["-"], "mno-3dnowa">, Group<m_x86_Features_Group>; Modified: cfe/trunk/include/clang/Frontend/CodeGenOptions.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/CodeGenOptions.h?rev=252463&r1=252462&r2=252463&view=diff ============================================================================== --- cfe/trunk/include/clang/Frontend/CodeGenOptions.h (original) +++ cfe/trunk/include/clang/Frontend/CodeGenOptions.h Mon Nov 9 06:40:41 2015 @@ -167,6 +167,9 @@ public: /// Name of the profile file to use as input for -fprofile-instr-use std::string InstrProfileInput; + /// The EABI version to use + std::string EABIVersion; + /// A list of file names passed with -fcuda-include-gpubinary options to /// forward to CUDA runtime back-end for incorporating them into host-side /// object file. Modified: cfe/trunk/lib/CodeGen/BackendUtil.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/BackendUtil.cpp?rev=252463&r1=252462&r2=252463&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/BackendUtil.cpp (original) +++ cfe/trunk/lib/CodeGen/BackendUtil.cpp Mon Nov 9 06:40:41 2015 @@ -515,6 +515,14 @@ TargetMachine *EmitAssemblyHelper::Creat Options.UseInitArray = CodeGenOpts.UseInitArray; Options.DisableIntegratedAS = CodeGenOpts.DisableIntegratedAS; Options.CompressDebugSections = CodeGenOpts.CompressDebugSections; + + // Set EABI version. + Options.EABIVersion = llvm::StringSwitch<llvm::EABI>(CodeGenOpts.EABIVersion) + .Case("4", llvm::EABI::EABI4) + .Case("5", llvm::EABI::EABI5) + .Case("gnu", llvm::EABI::GNU) + .Default(llvm::EABI::Default); + Options.LessPreciseFPMADOption = CodeGenOpts.LessPreciseFPMAD; Options.NoInfsFPMath = CodeGenOpts.NoInfsFPMath; Options.NoNaNsFPMath = CodeGenOpts.NoNaNsFPMath; Modified: cfe/trunk/lib/Driver/Tools.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=252463&r1=252462&r2=252463&view=diff ============================================================================== --- cfe/trunk/lib/Driver/Tools.cpp (original) +++ cfe/trunk/lib/Driver/Tools.cpp Mon Nov 9 06:40:41 2015 @@ -3412,6 +3412,11 @@ void Clang::ConstructJob(Compilation &C, } } + if (Arg *A = Args.getLastArg(options::OPT_meabi)) { + CmdArgs.push_back("-meabi"); + CmdArgs.push_back(A->getValue()); + } + CmdArgs.push_back("-mthread-model"); if (Arg *A = Args.getLastArg(options::OPT_mthread_model)) CmdArgs.push_back(A->getValue()); Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=252463&r1=252462&r2=252463&view=diff ============================================================================== --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original) +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Mon Nov 9 06:40:41 2015 @@ -38,6 +38,7 @@ #include "llvm/Support/Host.h" #include "llvm/Support/Path.h" #include "llvm/Support/Process.h" +#include "llvm/Target/TargetOptions.h" #include <atomic> #include <memory> #include <sys/stat.h> @@ -456,6 +457,20 @@ static bool ParseCodeGenArgs(CodeGenOpti Opts.DisableFree = Args.hasArg(OPT_disable_free); Opts.DisableTailCalls = Args.hasArg(OPT_mdisable_tail_calls); Opts.FloatABI = Args.getLastArgValue(OPT_mfloat_abi); + if (Arg *A = Args.getLastArg(OPT_meabi)) { + StringRef Value = A->getValue(); + llvm::EABI EABIVersion = llvm::StringSwitch<llvm::EABI>(Value) + .Case("default", llvm::EABI::Default) + .Case("4", llvm::EABI::EABI4) + .Case("5", llvm::EABI::EABI5) + .Case("gnu", llvm::EABI::GNU) + .Default(llvm::EABI::Unknown); + if (EABIVersion == llvm::EABI::Unknown) + Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) + << Value; + else + Opts.EABIVersion = Value; + } Opts.LessPreciseFPMAD = Args.hasArg(OPT_cl_mad_enable); Opts.LimitFloatPrecision = Args.getLastArgValue(OPT_mlimit_float_precision); Opts.NoInfsFPMath = (Args.hasArg(OPT_menable_no_infinities) || Added: cfe/trunk/test/CodeGen/arm-eabi.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/arm-eabi.c?rev=252463&view=auto ============================================================================== --- cfe/trunk/test/CodeGen/arm-eabi.c (added) +++ cfe/trunk/test/CodeGen/arm-eabi.c Mon Nov 9 06:40:41 2015 @@ -0,0 +1,20 @@ +// REQUIRES: arm-registered-target +// RUN: %clang -target arm-none-eabi -S -o - %s | FileCheck -check-prefix=CHECK-EABI %s +// RUN: %clang -target arm-none-eabi -S -meabi gnu -o - %s | FileCheck -check-prefix=CHECK-GNUEABI %s +// RUN: %clang -target arm-none-eabihf -S -o - %s | FileCheck -check-prefix=CHECK-EABI %s +// RUN: %clang -target arm-none-eabihf -S -meabi gnu -o - %s | FileCheck -check-prefix=CHECK-GNUEABI %s +// RUN: %clang -target arm-none-gnueabi -S -o - %s | FileCheck -check-prefix=CHECK-GNUEABI %s +// RUN: %clang -target arm-none-gnueabi -S -meabi 5 -o - %s | FileCheck -check-prefix=CHECK-EABI %s +// RUN: %clang -target arm-none-gnueabihf -S -o - %s | FileCheck -check-prefix=CHECK-GNUEABI %s +// RUN: %clang -target arm-none-gnueabihf -S -meabi 5 -o - %s | FileCheck -check-prefix=CHECK-EABI %s + +struct my_s { + unsigned long a[18]; +}; + +// CHECK-LABEL: foo +// CHECK-EABI: bl __aeabi_memcpy4 +// CHECK-GNUEABI: bl memcpy +void foo(unsigned long *t) { + *(struct my_s *)t = *((struct my_s *)(1UL)); +} Added: cfe/trunk/test/Driver/eabi.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/eabi.c?rev=252463&view=auto ============================================================================== --- cfe/trunk/test/Driver/eabi.c (added) +++ cfe/trunk/test/Driver/eabi.c Mon Nov 9 06:40:41 2015 @@ -0,0 +1,13 @@ +// RUN: %clang %s -meabi 4 -### 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-EABI4 %s +// RUN: %clang %s -meabi 5 -### 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-EABI5 %s +// RUN: %clang %s -meabi gnu -### 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-GNUEABI %s +// RUN: not %clang %s -meabi unknown 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-UNKNOWN %s + +// CHECK-EABI4: "-meabi" "4" +// CHECK-EABI5: "-meabi" "5" +// CHECK-GNUEABI: "-meabi" "gnu" +// CHECK-UNKNOWN: error: invalid value 'unknown' in '-meabi unknown' _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits