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