From d6c653eb5fecbdeeb1fbc6182803dada29f55d1b Mon Sep 17 00:00:00 2001
From: Wolfgang Puffitsch <hausen@gmx.at>
Date: Tue, 27 Aug 2013 14:45:14 +0200
Subject: [PATCH] Revise handling of memory mapping.

---
 include/clang/Driver/Options.td |  8 +++++---
 lib/Driver/Tools.cpp            | 34 +++++++++++++++++++++++++++++----
 2 files changed, 35 insertions(+), 7 deletions(-)

diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td
index 23e3f5d97f..6337aeb46f 100644
--- a/include/clang/Driver/Options.td
+++ b/include/clang/Driver/Options.td
@@ -1014,12 +1014,14 @@ def multi__module : Flag<["-"], "multi_module">;
 def multiply__defined__unused : Separate<["-"], "multiply_defined_unused">;
 def multiply__defined : Separate<["-"], "multiply_defined">;
 def mwarn_nonportable_cfstrings : Flag<["-"], "mwarn-nonportable-cfstrings">, Group<m_Group>;
-def mpatmos_iomap_base : Joined<["-"], "mpatmos-iomap-base=">, Group<m_Patmos_Group>;
 def mpatmos_stack_base : Joined<["-"], "mpatmos-stack-base=">, Group<m_Patmos_Group>;
 def mpatmos_shadow_stack_base : Joined<["-"], "mpatmos-shadow-stack-base=">, Group<m_Patmos_Group>;
 def mpatmos_heap_end : Joined<["-"], "mpatmos-heap-end=">, Group<m_Patmos_Group>;
-def mpatmos_uart_status_base : Joined<["-"], "mpatmos-uart-status-base=">, Group<m_Patmos_Group>;
-def mpatmos_uart_data_base : Joined<["-"], "mpatmos-uart-data-base=">, Group<m_Patmos_Group>;
+def mpatmos_iomap_base : Joined<["-"], "mpatmos-iomap-base=">, Group<m_Patmos_Group>;
+def mpatmos_cpuinfo_offset : Joined<["-"], "mpatmos-cpuinfo-offset=">, Group<m_Patmos_Group>;
+def mpatmos_excunit_offset : Joined<["-"], "mpatmos-excunit-offset=">, Group<m_Patmos_Group>;
+def mpatmos_timer_offset : Joined<["-"], "mpatmos-timer-offset=">, Group<m_Patmos_Group>;
+def mpatmos_uart_offset : Joined<["-"], "mpatmos-uart-offset=">, Group<m_Patmos_Group>;
 def m_Separate : Separate<["-"], "m">, Group<m_Group>;
 def m_Joined : Joined<["-"], "m">, Group<m_Group>;
 def no_canonical_prefixes : Flag<["-"], "no-canonical-prefixes">, Flags<[HelpHidden]>,
diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp
index f290a86466..dd32d3c4ab 100644
--- a/lib/Driver/Tools.cpp
+++ b/lib/Driver/Tools.cpp
@@ -3944,6 +3944,26 @@ static void render_patmos_symbol(OptSpecifier Opt, const char* Symbol,
   Out.push_back(Args.MakeArgString(tmp));
 }
 
+/// render_patmos_iodev_symbol - check if a -mpatmos-<symbol> option
+/// was given, if so render a --defsym to the out arguments list using
+/// its value as offset from iomap_base. Otherwise, render a --defsym
+/// using the default value os offset.
+static void render_patmos_iodev_symbol(OptSpecifier Opt, const char* Symbol,
+									   const ArgList &Args, const char *Default,
+									   ArgStringList &Out)
+{
+  Out.push_back("--defsym");
+  std::string tmp(Symbol);
+  tmp += "=";
+  tmp += "_iomap_base+";
+
+  // get option value
+  Arg *a = Args.getLastArg(Opt);
+  tmp += a ? a->getValue() : Default;
+
+  Out.push_back(Args.MakeArgString(tmp));
+}
+
 llvm::sys::LLVMFileType
 patmos::PatmosBaseTool::getFileType(std::string filename) const {
   llvm::sys::Path Pathname( filename );
@@ -4734,11 +4754,17 @@ void patmos::PatmosBaseTool::ConstructGoldJob(const Tool &Creator,
     render_patmos_symbol(options::OPT_mpatmos_iomap_base,
                          "_iomap_base", Args, "0xF0000000", LDArgs);
 
-    render_patmos_symbol(options::OPT_mpatmos_uart_status_base,
-                         "_uart_status_base", Args, "0xF0000100", LDArgs);
+    render_patmos_iodev_symbol(options::OPT_mpatmos_cpuinfo_offset,
+                         "_cpuinfo_base", Args, "0x0000", LDArgs);
+
+    render_patmos_iodev_symbol(options::OPT_mpatmos_excunit_offset,
+                         "_excunit_base", Args, "0x0100", LDArgs);
+
+    render_patmos_iodev_symbol(options::OPT_mpatmos_timer_offset,
+                         "_timer_base", Args, "0x0200", LDArgs);
 
-    render_patmos_symbol(options::OPT_mpatmos_uart_data_base,
-                         "_uart_data_base", Args, "0xF0000104", LDArgs);
+    render_patmos_iodev_symbol(options::OPT_mpatmos_uart_offset,
+                         "_uart_base", Args, "0x0800", LDArgs);
 
     LDArgs.push_back("--defsym");
     LDArgs.push_back("__heap_start=end");
-- 
GitLab