From c70a9fdd64ea838e7f82ffb6f80a350916a2026f Mon Sep 17 00:00:00 2001 From: Stefan Hepp <stefan@stefant.org> Date: Wed, 19 Mar 2014 02:42:42 +0100 Subject: [PATCH] Added -fpatmos-emit-llvm option for linker, renamed -fpatmos-emit-obj to -fpatmos-emit-reloc --- include/clang/Driver/Options.td | 8 +++++--- lib/Driver/Tools.cpp | 36 +++++++++++++++++++-------------- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td index ffad48eef3..67531b945b 100644 --- a/include/clang/Driver/Options.td +++ b/include/clang/Driver/Options.td @@ -753,12 +753,14 @@ def fpack_struct_EQ : Joined<["-"], "fpack-struct=">, Group<f_Group>, Flags<[CC1 def fpascal_strings : Flag<["-"], "fpascal-strings">, Group<f_Group>, Flags<[CC1Option]>, HelpText<"Recognize and construct Pascal-style string literals">; -def fpatmos_emit_obj : Flag<["-"], "fpatmos-emit-obj">, - HelpText<"Generate a relocatable object instead of an executable object or bitcode">; +def fpatmos_emit_llvm : Flag<["-"], "fpatmos-emit-llvm">, + HelpText<"Generate bitcode instead of a native binary">; +def fpatmos_emit_reloc : Flag<["-"], "fpatmos-emit-reloc">, + HelpText<"Generate a relocatable object instead of an executable or bitcode">; def fpatmos_emit_asm : Flag<["-"], "fpatmos-emit-asm">, HelpText<"Generate native assembler code">; def fpatmos_link_object: Flag<["-"], "fpatmos-link-object">, - HelpText<"Link as object, i.e., do not link in libraries or startup code">; + HelpText<"Link as (relocatable) object, i.e., do not link in libraries or startup code. Emits bitcode by default.">; def fpatmos_disable_internalize: Flag<["-"], "fpatmos-disable-internalize">, HelpText<"Disable internalize pass after bitcode linking">; def fpatmos_no_std_link_opts: Flag<["-"], "fpatmos-no-std-link-opts">, diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 86731dabfd..518852f652 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -5242,12 +5242,16 @@ void patmos::Compile::ConstructJob(Compilation &C, const JobAction &JA, bool IsLastPhase = false; if (Arg *A = C.getArgs().getLastArg(options::OPT_emit_llvm, - options::OPT_fpatmos_emit_obj, options::OPT_fpatmos_emit_asm)) + options::OPT_fpatmos_emit_llvm, + options::OPT_fpatmos_emit_reloc, + options::OPT_fpatmos_emit_asm)) { - if (A->getOption().matches(options::OPT_emit_llvm)) { + if (A->getOption().matches(options::OPT_emit_llvm) || + A->getOption().matches(options::OPT_fpatmos_emit_llvm)) + { EmitLLVM = true; } - else if (A->getOption().matches(options::OPT_fpatmos_emit_obj)) { + else if (A->getOption().matches(options::OPT_fpatmos_emit_reloc)) { EmitLLVM = false; EmitAsm = false; } @@ -5350,9 +5354,10 @@ void patmos::Link::ConstructJob(Compilation &C, const JobAction &JA, bool LinkAsObject = C.getArgs().hasArg(options::OPT_fpatmos_link_object); // Do not execute llc and gold - bool EmitLLVM = C.getArgs().hasArg(options::OPT_emit_llvm); + bool EmitLLVM = C.getArgs().hasArg(options::OPT_fpatmos_emit_llvm) || + C.getArgs().hasArg(options::OPT_emit_llvm); // Do not execute gold - bool EmitObject = C.getArgs().hasArg(options::OPT_fpatmos_emit_obj); + bool EmitObject = C.getArgs().hasArg(options::OPT_fpatmos_emit_reloc); // Do not execute gold, emit assembler bool EmitAsm = C.getArgs().hasArg(options::OPT_fpatmos_emit_asm); @@ -5379,23 +5384,24 @@ void patmos::Link::ConstructJob(Compilation &C, const JobAction &JA, } bool StopAfterLink = EmitLLVM && SkipOpt; - bool StopAfterLLC = EmitAsm || EmitObject; + bool StopAfterOpt = EmitLLVM; + bool StopAfterLLC = EmitAsm; //---------------------------------------------------------------------------- // Sanity checks and check for some unsupported options if (EmitObject && EmitAsm) { - llvm::report_fatal_error("-fpatmos-emit-obj and -fpatmos-emit-asm are mutually exclusive"); + llvm::report_fatal_error("-fpatmos-emit-reloc and -fpatmos-emit-asm are mutually exclusive"); } if (EmitLLVM && (EmitObject || EmitAsm)) { - llvm::report_fatal_error("-emit-llvm cannot be used with -fpatmos-emit-obj or -fpatmos-emit-asm"); - } - if (UseLTO && (EmitLLVM || EmitObject || EmitAsm)) { - llvm::report_fatal_error("-emit-* cannot be used when linking with LTO support"); + llvm::report_fatal_error("-fpatmos-emit-llvm cannot be used with -fpatmos-emit-reloc or -fpatmos-emit-asm"); } if (UseLTO && LinkAsObject) { llvm::report_fatal_error("-fpatmos-link-object and linking with LTO support is mutually exclusive."); } + if (UseLTO && (EmitLLVM || EmitObject || EmitAsm)) { + llvm::report_fatal_error("-fpatmos-emit-* cannot be used when linking with LTO support"); + } if (Arg *A = Args.getLastArg(options::OPT_shared)) { D.Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args); @@ -5447,16 +5453,16 @@ void patmos::Link::ConstructJob(Compilation &C, const JobAction &JA, if (!SkipOpt && linkedBCFileName) { char const *optimizedBCFileName = - CreateOutputFilename(C, Output, "opt-", "opt.bc", EmitLLVM); + CreateOutputFilename(C, Output, "opt-", "opt.bc", StopAfterOpt); if (ConstructOptJob(*this, C, JA, optimizedBCFileName, linkedBCFileName, - Args, true, LinkAsObject, EmitLLVM)) { + Args, true, LinkAsObject, StopAfterOpt)) { linkedBCFileName = optimizedBCFileName; } } // If we only want to emit bitcode, we are done now. - if (EmitLLVM) { + if (StopAfterOpt) { return; } @@ -5489,7 +5495,7 @@ void patmos::Link::ConstructJob(Compilation &C, const JobAction &JA, } ConstructGoldJob(*this, C, JA, linkedELFFileName, GoldInputs, Args, - UseLTO, LinkAsObject, !LinkRTEMS); + UseLTO, EmitObject || LinkAsObject, !LinkRTEMS); } -- GitLab