[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. llvm-svn: 252463
This commit is contained in:
@@ -1281,6 +1281,8 @@ def mstack_probe_size : Joined<["-"], "mstack-probe-size=">, Group<m_Group>, Fla
|
|||||||
HelpText<"Set the stack probe size">;
|
HelpText<"Set the stack probe size">;
|
||||||
def mthread_model : Separate<["-"], "mthread-model">, Group<m_Group>, Flags<[CC1Option]>,
|
def mthread_model : Separate<["-"], "mthread-model">, Group<m_Group>, Flags<[CC1Option]>,
|
||||||
HelpText<"The thread model to use, e.g. posix, single (posix by default)">;
|
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 mmmx : Flag<["-"], "mmmx">, Group<m_x86_Features_Group>;
|
||||||
def mno_3dnowa : Flag<["-"], "mno-3dnowa">, Group<m_x86_Features_Group>;
|
def mno_3dnowa : Flag<["-"], "mno-3dnowa">, Group<m_x86_Features_Group>;
|
||||||
|
|||||||
@@ -167,6 +167,9 @@ public:
|
|||||||
/// Name of the profile file to use as input for -fprofile-instr-use
|
/// Name of the profile file to use as input for -fprofile-instr-use
|
||||||
std::string InstrProfileInput;
|
std::string InstrProfileInput;
|
||||||
|
|
||||||
|
/// The EABI version to use
|
||||||
|
std::string EABIVersion;
|
||||||
|
|
||||||
/// A list of file names passed with -fcuda-include-gpubinary options to
|
/// A list of file names passed with -fcuda-include-gpubinary options to
|
||||||
/// forward to CUDA runtime back-end for incorporating them into host-side
|
/// forward to CUDA runtime back-end for incorporating them into host-side
|
||||||
/// object file.
|
/// object file.
|
||||||
|
|||||||
@@ -515,6 +515,14 @@ TargetMachine *EmitAssemblyHelper::CreateTargetMachine(bool MustCreateTM) {
|
|||||||
Options.UseInitArray = CodeGenOpts.UseInitArray;
|
Options.UseInitArray = CodeGenOpts.UseInitArray;
|
||||||
Options.DisableIntegratedAS = CodeGenOpts.DisableIntegratedAS;
|
Options.DisableIntegratedAS = CodeGenOpts.DisableIntegratedAS;
|
||||||
Options.CompressDebugSections = CodeGenOpts.CompressDebugSections;
|
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.LessPreciseFPMADOption = CodeGenOpts.LessPreciseFPMAD;
|
||||||
Options.NoInfsFPMath = CodeGenOpts.NoInfsFPMath;
|
Options.NoInfsFPMath = CodeGenOpts.NoInfsFPMath;
|
||||||
Options.NoNaNsFPMath = CodeGenOpts.NoNaNsFPMath;
|
Options.NoNaNsFPMath = CodeGenOpts.NoNaNsFPMath;
|
||||||
|
|||||||
@@ -3412,6 +3412,11 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
|
||||||
|
CmdArgs.push_back("-meabi");
|
||||||
|
CmdArgs.push_back(A->getValue());
|
||||||
|
}
|
||||||
|
|
||||||
CmdArgs.push_back("-mthread-model");
|
CmdArgs.push_back("-mthread-model");
|
||||||
if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
|
if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
|
||||||
CmdArgs.push_back(A->getValue());
|
CmdArgs.push_back(A->getValue());
|
||||||
|
|||||||
@@ -38,6 +38,7 @@
|
|||||||
#include "llvm/Support/Host.h"
|
#include "llvm/Support/Host.h"
|
||||||
#include "llvm/Support/Path.h"
|
#include "llvm/Support/Path.h"
|
||||||
#include "llvm/Support/Process.h"
|
#include "llvm/Support/Process.h"
|
||||||
|
#include "llvm/Target/TargetOptions.h"
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
@@ -456,6 +457,20 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
|
|||||||
Opts.DisableFree = Args.hasArg(OPT_disable_free);
|
Opts.DisableFree = Args.hasArg(OPT_disable_free);
|
||||||
Opts.DisableTailCalls = Args.hasArg(OPT_mdisable_tail_calls);
|
Opts.DisableTailCalls = Args.hasArg(OPT_mdisable_tail_calls);
|
||||||
Opts.FloatABI = Args.getLastArgValue(OPT_mfloat_abi);
|
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.LessPreciseFPMAD = Args.hasArg(OPT_cl_mad_enable);
|
||||||
Opts.LimitFloatPrecision = Args.getLastArgValue(OPT_mlimit_float_precision);
|
Opts.LimitFloatPrecision = Args.getLastArgValue(OPT_mlimit_float_precision);
|
||||||
Opts.NoInfsFPMath = (Args.hasArg(OPT_menable_no_infinities) ||
|
Opts.NoInfsFPMath = (Args.hasArg(OPT_menable_no_infinities) ||
|
||||||
|
|||||||
20
clang/test/CodeGen/arm-eabi.c
Normal file
20
clang/test/CodeGen/arm-eabi.c
Normal file
@@ -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));
|
||||||
|
}
|
||||||
13
clang/test/Driver/eabi.c
Normal file
13
clang/test/Driver/eabi.c
Normal file
@@ -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'
|
||||||
Reference in New Issue
Block a user