forked from OSchip/llvm-project
Handle -Wa,--mrelax-relocations=[no|yes].
llvm-svn: 271162
This commit is contained in:
parent
fd82f0501f
commit
f8f01c3d59
|
@ -143,6 +143,8 @@ def mno_exec_stack : Flag<["-"], "mnoexecstack">,
|
||||||
HelpText<"Mark the file as not needing an executable stack">;
|
HelpText<"Mark the file as not needing an executable stack">;
|
||||||
def massembler_fatal_warnings : Flag<["-"], "massembler-fatal-warnings">,
|
def massembler_fatal_warnings : Flag<["-"], "massembler-fatal-warnings">,
|
||||||
HelpText<"Make assembler warnings fatal">;
|
HelpText<"Make assembler warnings fatal">;
|
||||||
|
def mrelax_relocations : Flag<["--"], "mrelax-relocations">,
|
||||||
|
HelpText<"Use relaxabel elf relocations">;
|
||||||
def compress_debug_sections : Flag<["-"], "compress-debug-sections">,
|
def compress_debug_sections : Flag<["-"], "compress-debug-sections">,
|
||||||
HelpText<"Compress DWARF debug sections using zlib">;
|
HelpText<"Compress DWARF debug sections using zlib">;
|
||||||
def msave_temp_labels : Flag<["-"], "msave-temp-labels">,
|
def msave_temp_labels : Flag<["-"], "msave-temp-labels">,
|
||||||
|
|
|
@ -30,6 +30,7 @@ CODEGENOPT(Name, Bits, Default)
|
||||||
|
|
||||||
CODEGENOPT(DisableIntegratedAS, 1, 0) ///< -no-integrated-as
|
CODEGENOPT(DisableIntegratedAS, 1, 0) ///< -no-integrated-as
|
||||||
CODEGENOPT(CompressDebugSections, 1, 0) ///< -Wa,-compress-debug-sections
|
CODEGENOPT(CompressDebugSections, 1, 0) ///< -Wa,-compress-debug-sections
|
||||||
|
CODEGENOPT(RelaxELFRelocations, 1, 0) ///< -Wa,--mrelax-relocations
|
||||||
CODEGENOPT(AsmVerbose , 1, 0) ///< -dA, -fverbose-asm.
|
CODEGENOPT(AsmVerbose , 1, 0) ///< -dA, -fverbose-asm.
|
||||||
CODEGENOPT(AssumeSaneOperatorNew , 1, 1) ///< implicit __attribute__((malloc)) operator new
|
CODEGENOPT(AssumeSaneOperatorNew , 1, 1) ///< implicit __attribute__((malloc)) operator new
|
||||||
CODEGENOPT(Autolink , 1, 1) ///< -fno-autolink
|
CODEGENOPT(Autolink , 1, 1) ///< -fno-autolink
|
||||||
|
|
|
@ -593,6 +593,7 @@ 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;
|
||||||
|
Options.RelaxELFRelocations = CodeGenOpts.RelaxELFRelocations;
|
||||||
|
|
||||||
// Set EABI version.
|
// Set EABI version.
|
||||||
Options.EABIVersion = llvm::StringSwitch<llvm::EABI>(TargetOpts.EABIVersion)
|
Options.EABIVersion = llvm::StringSwitch<llvm::EABI>(TargetOpts.EABIVersion)
|
||||||
|
|
|
@ -2797,6 +2797,8 @@ static void CollectArgsForIntegratedAssembler(Compilation &C,
|
||||||
// When using an integrated assembler, translate -Wa, and -Xassembler
|
// When using an integrated assembler, translate -Wa, and -Xassembler
|
||||||
// options.
|
// options.
|
||||||
bool CompressDebugSections = false;
|
bool CompressDebugSections = false;
|
||||||
|
|
||||||
|
bool UseRelaxRelocations = false;
|
||||||
const char *MipsTargetFeature = nullptr;
|
const char *MipsTargetFeature = nullptr;
|
||||||
for (const Arg *A :
|
for (const Arg *A :
|
||||||
Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
|
Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
|
||||||
|
@ -2872,6 +2874,12 @@ static void CollectArgsForIntegratedAssembler(Compilation &C,
|
||||||
} else if (Value == "-nocompress-debug-sections" ||
|
} else if (Value == "-nocompress-debug-sections" ||
|
||||||
Value == "--nocompress-debug-sections") {
|
Value == "--nocompress-debug-sections") {
|
||||||
CompressDebugSections = false;
|
CompressDebugSections = false;
|
||||||
|
} else if (Value == "-mrelax-relocations=yes" ||
|
||||||
|
Value == "--mrelax-relocations=yes") {
|
||||||
|
UseRelaxRelocations = true;
|
||||||
|
} else if (Value == "-mrelax-relocations=no" ||
|
||||||
|
Value == "--mrelax-relocations=no") {
|
||||||
|
UseRelaxRelocations = false;
|
||||||
} else if (Value.startswith("-I")) {
|
} else if (Value.startswith("-I")) {
|
||||||
CmdArgs.push_back(Value.data());
|
CmdArgs.push_back(Value.data());
|
||||||
// We need to consume the next argument if the current arg is a plain
|
// We need to consume the next argument if the current arg is a plain
|
||||||
|
@ -2903,6 +2911,8 @@ static void CollectArgsForIntegratedAssembler(Compilation &C,
|
||||||
else
|
else
|
||||||
D.Diag(diag::warn_debug_compression_unavailable);
|
D.Diag(diag::warn_debug_compression_unavailable);
|
||||||
}
|
}
|
||||||
|
if (UseRelaxRelocations)
|
||||||
|
CmdArgs.push_back("--mrelax-relocations");
|
||||||
if (MipsTargetFeature != nullptr) {
|
if (MipsTargetFeature != nullptr) {
|
||||||
CmdArgs.push_back("-target-feature");
|
CmdArgs.push_back("-target-feature");
|
||||||
CmdArgs.push_back(MipsTargetFeature);
|
CmdArgs.push_back(MipsTargetFeature);
|
||||||
|
|
|
@ -683,6 +683,7 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
|
||||||
Opts.InstrumentForProfiling = Args.hasArg(OPT_pg);
|
Opts.InstrumentForProfiling = Args.hasArg(OPT_pg);
|
||||||
Opts.EmitOpenCLArgMetadata = Args.hasArg(OPT_cl_kernel_arg_info);
|
Opts.EmitOpenCLArgMetadata = Args.hasArg(OPT_cl_kernel_arg_info);
|
||||||
Opts.CompressDebugSections = Args.hasArg(OPT_compress_debug_sections);
|
Opts.CompressDebugSections = Args.hasArg(OPT_compress_debug_sections);
|
||||||
|
Opts.RelaxELFRelocations = Args.hasArg(OPT_mrelax_relocations);
|
||||||
Opts.DebugCompilationDir = Args.getLastArgValue(OPT_fdebug_compilation_dir);
|
Opts.DebugCompilationDir = Args.getLastArgValue(OPT_fdebug_compilation_dir);
|
||||||
for (auto A : Args.filtered(OPT_mlink_bitcode_file, OPT_mlink_cuda_bitcode)) {
|
for (auto A : Args.filtered(OPT_mlink_bitcode_file, OPT_mlink_cuda_bitcode)) {
|
||||||
unsigned LinkFlags = llvm::Linker::Flags::None;
|
unsigned LinkFlags = llvm::Linker::Flags::None;
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -emit-obj --mrelax-relocations %s -mrelocation-model pic -o %t
|
||||||
|
// RUN: llvm-readobj -r %t | FileCheck %s
|
||||||
|
|
||||||
|
// CHECK: R_X86_64_REX_GOTPCRELX foo
|
||||||
|
|
||||||
|
extern int foo;
|
||||||
|
int *f(void) {
|
||||||
|
return &foo;
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
// RUN: %clang -### -c -integrated-as -Wa,--mrelax-relocations=yes %s 2>&1 | FileCheck %s
|
||||||
|
|
||||||
|
// CHECK: "-cc1"
|
||||||
|
// CHECK: "--mrelax-relocations"
|
|
@ -0,0 +1,12 @@
|
||||||
|
// REQUIRES: x86-registered-target
|
||||||
|
// RUN: %clang -### -c -integrated-as -Wa,--mrelax-relocations=yes %s 2>&1 | FileCheck %s
|
||||||
|
|
||||||
|
// CHECK: "-cc1as"
|
||||||
|
// CHECK: "--mrelax-relocations"
|
||||||
|
|
||||||
|
// RUN: %clang -cc1as -triple x86_64-pc-linux --mrelax-relocations %s -o %t -filetype obj
|
||||||
|
// RUN: llvm-readobj -r %t | FileCheck --check-prefix=REL %s
|
||||||
|
|
||||||
|
// REL: R_X86_64_REX_GOTPCRELX foo
|
||||||
|
|
||||||
|
movq foo@GOTPCREL(%rip), %rax
|
|
@ -88,6 +88,7 @@ struct AssemblerInvocation {
|
||||||
unsigned SaveTemporaryLabels : 1;
|
unsigned SaveTemporaryLabels : 1;
|
||||||
unsigned GenDwarfForAssembly : 1;
|
unsigned GenDwarfForAssembly : 1;
|
||||||
unsigned CompressDebugSections : 1;
|
unsigned CompressDebugSections : 1;
|
||||||
|
unsigned RelaxELFRelocations : 1;
|
||||||
unsigned DwarfVersion;
|
unsigned DwarfVersion;
|
||||||
std::string DwarfDebugFlags;
|
std::string DwarfDebugFlags;
|
||||||
std::string DwarfDebugProducer;
|
std::string DwarfDebugProducer;
|
||||||
|
@ -200,6 +201,7 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts,
|
||||||
// Any DebugInfoKind implies GenDwarfForAssembly.
|
// Any DebugInfoKind implies GenDwarfForAssembly.
|
||||||
Opts.GenDwarfForAssembly = Args.hasArg(OPT_debug_info_kind_EQ);
|
Opts.GenDwarfForAssembly = Args.hasArg(OPT_debug_info_kind_EQ);
|
||||||
Opts.CompressDebugSections = Args.hasArg(OPT_compress_debug_sections);
|
Opts.CompressDebugSections = Args.hasArg(OPT_compress_debug_sections);
|
||||||
|
Opts.RelaxELFRelocations = Args.hasArg(OPT_mrelax_relocations);
|
||||||
Opts.DwarfVersion = getLastArgIntValue(Args, OPT_dwarf_version_EQ, 2, Diags);
|
Opts.DwarfVersion = getLastArgIntValue(Args, OPT_dwarf_version_EQ, 2, Diags);
|
||||||
Opts.DwarfDebugFlags = Args.getLastArgValue(OPT_dwarf_debug_flags);
|
Opts.DwarfDebugFlags = Args.getLastArgValue(OPT_dwarf_debug_flags);
|
||||||
Opts.DwarfDebugProducer = Args.getLastArgValue(OPT_dwarf_debug_producer);
|
Opts.DwarfDebugProducer = Args.getLastArgValue(OPT_dwarf_debug_producer);
|
||||||
|
@ -315,6 +317,8 @@ static bool ExecuteAssembler(AssemblerInvocation &Opts,
|
||||||
if (Opts.CompressDebugSections)
|
if (Opts.CompressDebugSections)
|
||||||
MAI->setCompressDebugSections(DebugCompressionType::DCT_ZlibGnu);
|
MAI->setCompressDebugSections(DebugCompressionType::DCT_ZlibGnu);
|
||||||
|
|
||||||
|
MAI->setRelaxELFRelocations(Opts.RelaxELFRelocations);
|
||||||
|
|
||||||
bool IsBinary = Opts.OutputType == AssemblerInvocation::FT_Obj;
|
bool IsBinary = Opts.OutputType == AssemblerInvocation::FT_Obj;
|
||||||
std::unique_ptr<raw_fd_ostream> FDOS = getOutputStream(Opts, Diags, IsBinary);
|
std::unique_ptr<raw_fd_ostream> FDOS = getOutputStream(Opts, Diags, IsBinary);
|
||||||
if (!FDOS)
|
if (!FDOS)
|
||||||
|
|
Loading…
Reference in New Issue