shiva0217 updated this revision to Diff 185491.
shiva0217 added a comment.

1. Remove passing path for LTO because Eli raised the concern that whether it 
would appropriate to assign the same limitation for all files when LTO enabled.
2. Add -msmall-data-limitation= as James pointed out it's the main setting flag 
for RISCV GCC


Repository:
  rC Clang

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D57497/new/

https://reviews.llvm.org/D57497

Files:
  docs/ClangCommandLineReference.rst
  include/clang/Driver/Options.td
  lib/Driver/ToolChains/Clang.cpp
  lib/Driver/ToolChains/RISCVToolchain.cpp
  lib/Driver/ToolChains/RISCVToolchain.h
  test/Driver/riscv-features.c

Index: test/Driver/riscv-features.c
===================================================================
--- test/Driver/riscv-features.c
+++ test/Driver/riscv-features.c
@@ -11,3 +11,37 @@
 // NO-RELAX: "-target-feature" "-relax"
 // DEFAULT-NOT: "-target-feature" "+relax"
 // DEFAULT-NOT: "-target-feature" "-relax"
+
+/// Small data section limitaion setting.
+// RUN: %clang -target riscv32 -### -S %s 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-RV32 %s
+// CHECK-RV32-NOT: "-mllvm" "-riscv-ssection-threshold"
+// RUN: %clang -target riscv64 -### -S %s 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-RV64 %s
+// CHECK-RV64-NOT: "-mllvm" "-riscv-ssection-threshold"
+// RUN: %clang -target riscv32 -### %s \
+// RUN:     -msmall-data-limit=0 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-RV32-T0 %s
+// CHECK-RV32-T0: "-mllvm" "-riscv-ssection-threshold=0"
+// RUN: %clang -target riscv64 -### %s \
+// RUN:     -G0 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-RV64-G0 %s
+// CHECK-RV64-G0: "-mllvm" "-riscv-ssection-threshold=0"
+// RUN: %clang -target riscv64 -mcmodel=large -### -S %s 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-RV64-LARGE %s
+// CHECK-RV64-LARGE: "-mllvm" "-riscv-ssection-threshold=0"
+// RUN: %clang -target riscv32 -fpic -### -S %s 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-RV32-PIC %s
+// CHECK-RV32-PIC: "-mllvm" "-riscv-ssection-threshold=0"
+// RUN: %clang -target riscv64 -fpic -### -S %s \
+// RUN:     -msmall-data-limit=16 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-RV64-PIC-T16 %s
+// CHECK-RV64-PIC-T16: "-mllvm" "-riscv-ssection-threshold=16"
+// RUN: %clang -target riscv32 -### -S %s \
+// RUN:     -msmall-data-limit=16 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-RV32-T16 %s
+// CHECK-RV32-T16: "-mllvm" "-riscv-ssection-threshold=16"
+// RUN: %clang -target riscv64 -mcmodel=large -### -S %s \
+// RUN:     -G16 2>&1 \
+// RUN:   | FileCheck --check-prefix=CHECK-RV64-LARGE-G16 %s
+// CHECK-RV64-LARGE-G16: "-mllvm" "-riscv-ssection-threshold=16"
Index: lib/Driver/ToolChains/RISCVToolchain.h
===================================================================
--- lib/Driver/ToolChains/RISCVToolchain.h
+++ lib/Driver/ToolChains/RISCVToolchain.h
@@ -32,6 +32,9 @@
   addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
                            llvm::opt::ArgStringList &CC1Args) const override;
 
+  static StringRef getSmallDataThreshold(const llvm::opt::ArgList &Args,
+                                         const llvm::Triple &Triple);
+
 protected:
   Tool *buildLinker() const override;
 
Index: lib/Driver/ToolChains/RISCVToolchain.cpp
===================================================================
--- lib/Driver/ToolChains/RISCVToolchain.cpp
+++ lib/Driver/ToolChains/RISCVToolchain.cpp
@@ -86,6 +86,25 @@
   return SysRootDir;
 }
 
+StringRef RISCVToolChain::getSmallDataThreshold(const ArgList &Args,
+                                                const llvm::Triple &Triple) {
+  StringRef Gn = "";
+  if (Arg *A = Args.getLastArg(options::OPT_G)) {
+    Gn = A->getValue();
+  // Not support linker relaxation for PIC.
+  } else if (Args.getLastArg(options::OPT_shared, options::OPT_fpic,
+                             options::OPT_fPIC)) {
+    Gn = "0";
+  // Not support linker relaxation for RV64 with large code model.
+  } else if (Args.getLastArgValue(options::OPT_mcmodel_EQ)
+                 .equals_lower("large") &&
+             (Triple.getArch() == llvm::Triple::riscv64)) {
+    Gn = "0";
+  }
+
+  return Gn;
+}
+
 void RISCV::Linker::ConstructJob(Compilation &C, const JobAction &JA,
                                  const InputInfo &Output,
                                  const InputInfoList &Inputs,
Index: lib/Driver/ToolChains/Clang.cpp
===================================================================
--- lib/Driver/ToolChains/Clang.cpp
+++ lib/Driver/ToolChains/Clang.cpp
@@ -21,6 +21,7 @@
 #include "MSP430.h"
 #include "InputInfo.h"
 #include "PS4CPU.h"
+#include "RISCVToolchain.h"
 #include "clang/Basic/CharInfo.h"
 #include "clang/Basic/LangOptions.h"
 #include "clang/Basic/ObjCRuntime.h"
@@ -1799,6 +1800,13 @@
 
   CmdArgs.push_back("-target-abi");
   CmdArgs.push_back(ABIName);
+
+  // Passing small data section limitaion.
+  StringRef T = toolchains::RISCVToolChain::getSmallDataThreshold(Args, Triple);
+  if (!T.empty()) {
+    CmdArgs.push_back("-mllvm");
+    CmdArgs.push_back(Args.MakeArgString("-riscv-ssection-threshold=" + T));
+  }
 }
 
 void Clang::AddSparcTargetArgs(const ArgList &Args,
Index: include/clang/Driver/Options.td
===================================================================
--- include/clang/Driver/Options.td
+++ include/clang/Driver/Options.td
@@ -2099,6 +2099,8 @@
   HelpText<"Enable linker relaxation">;
 def mno_relax : Flag<["-"], "mno-relax">, Group<m_riscv_Features_Group>,
   HelpText<"Disable linker relaxation">;
+def msmall_data_limit_EQ : Joined<["-"], "msmall-data-limit=">, Group<m_Group>, Alias<G>,
+  HelpText<"Put global and static data smaller than the limitation into a special section">;
 
 def munaligned_access : Flag<["-"], "munaligned-access">, Group<m_arm_Features_Group>,
   HelpText<"Allow memory accesses to be unaligned (AArch32/AArch64 only)">;
Index: docs/ClangCommandLineReference.rst
===================================================================
--- docs/ClangCommandLineReference.rst
+++ docs/ClangCommandLineReference.rst
@@ -2754,6 +2754,10 @@
 
 Enable linker relaxation
 
+.. option:: -msmall-data-limit=<arg>
+
+Put global and static data smaller than the limitation into a special section (RISCV only)
+
 Optimization level
 ~~~~~~~~~~~~~~~~~~
 
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to