summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Dardis <simon.dardis@imgtec.com>2017-08-03 14:01:17 +0000
committerSimon Dardis <simon.dardis@imgtec.com>2017-08-03 14:01:17 +0000
commit50f6d3545785b061ece2fad2355bc914912db7cc (patch)
tree1e2da19439342843c8662df7d342880cf06ce346
parentb5563c6817de8c002f44b771410ea8ad3c3c9000 (diff)
downloadbcm5719-llvm-50f6d3545785b061ece2fad2355bc914912db7cc.tar.gz
bcm5719-llvm-50f6d3545785b061ece2fad2355bc914912db7cc.zip
[mips] Implement -muninit-const-in-rodata
This option when combined with -mgpopt and -membedded-data places all uninitialized constant variables in the read-only section. Reviewers: atanasyan, nitesh.jain Differential Revision: https://reviews.llvm.org/D35917 llvm-svn: 309940
-rw-r--r--clang/include/clang/Driver/Options.td8
-rw-r--r--clang/include/clang/Frontend/CodeGenOptions.def2
-rw-r--r--clang/lib/CodeGen/TargetInfo.cpp14
-rw-r--r--clang/lib/Driver/ToolChains/Clang.cpp8
-rw-r--r--clang/lib/Frontend/CompilerInvocation.cpp2
-rw-r--r--clang/test/CodeGen/mips-uninit-const-in-ro.c10
6 files changed, 44 insertions, 0 deletions
diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td
index 571d52fc0aa..a3308733dbd 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -2057,6 +2057,14 @@ def membedded_data : Flag<["-"], "membedded-data">, Group<m_Group>,
def mno_embedded_data : Flag<["-"], "mno-embedded-data">, Group<m_Group>,
HelpText<"Do not place constants in the .rodata section instead of the "
".sdata if they meet the -G <size> threshold (MIPS)">;
+def muninit_const_in_rodata : Flag<["-"], "muninit-const-in-rodata">,
+ Group<m_Group>, Flags<[DriverOption,CC1Option]>, HelpText<"Place "
+ "uninitialized constants in the read-only data section instead of"
+ " the common section (MIPS)">;
+def mno_uninit_const_in_rodata : Flag<["-"], "mno-uninit-const-in-rodata">,
+ Group<m_Group>, HelpText<"Do not place uninitialized constants in the "
+ "read-only data section instead of the common"
+ " section (MIPS)">;
def mnan_EQ : Joined<["-"], "mnan=">, Group<m_Group>;
def mabicalls : Flag<["-"], "mabicalls">, Group<m_Group>,
HelpText<"Enable SVR4-style position-independent code (Mips only)">;
diff --git a/clang/include/clang/Frontend/CodeGenOptions.def b/clang/include/clang/Frontend/CodeGenOptions.def
index ec40ca11ed2..a5a26018a12 100644
--- a/clang/include/clang/Frontend/CodeGenOptions.def
+++ b/clang/include/clang/Frontend/CodeGenOptions.def
@@ -101,6 +101,8 @@ CODEGENOPT(MergeAllConstants , 1, 1) ///< Merge identical constants.
CODEGENOPT(MergeFunctions , 1, 0) ///< Set when -fmerge-functions is enabled.
CODEGENOPT(MSVolatile , 1, 0) ///< Set when /volatile:ms is enabled.
CODEGENOPT(NoCommon , 1, 0) ///< Set when -fno-common or C++ is enabled.
+CODEGENOPT(UInitCstDataInROData, 1, 0) ///< Set when -mgpopt & -membedded-data
+ ///< & -muinit-const-in-rodata is set
CODEGENOPT(NoDwarfDirectoryAsm , 1, 0) ///< Set when -fno-dwarf-directory-asm is
///< enabled.
CODEGENOPT(NoExecStack , 1, 0) ///< Set when -Wa,--noexecstack is enabled.
diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp
index 12341431ac0..473b312b42b 100644
--- a/clang/lib/CodeGen/TargetInfo.cpp
+++ b/clang/lib/CodeGen/TargetInfo.cpp
@@ -6656,6 +6656,20 @@ public:
void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
CodeGen::CodeGenModule &CGM,
ForDefinition_t IsForDefinition) const override {
+
+ if (const VarDecl *VD = dyn_cast_or_null<VarDecl>(D)) {
+ if (CGM.getCodeGenOpts().UInitCstDataInROData &&
+ VD->getType().isConstQualified() && !VD->hasInit()) {
+ llvm::GlobalVariable *GVar = dyn_cast_or_null<llvm::GlobalVariable>(GV);
+ if (GVar && !GVar->hasSection()) {
+ GVar->setLinkage(llvm::GlobalValue::ExternalLinkage);
+ GVar->setSection("rodata");
+ }
+ }
+
+ return;
+ }
+
const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D);
if (!FD) return;
llvm::Function *Fn = cast<llvm::Function>(GV);
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index 80fc9923d3b..896561b4d58 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -1515,6 +1515,14 @@ void Clang::AddMIPSTargetArgs(const ArgList &Args,
CmdArgs.push_back("-membedded-data=0");
}
EmbeddedData->claim();
+
+ if (Arg *A = Args.getLastArg(options::OPT_muninit_const_in_rodata,
+ options::OPT_mno_uninit_const_in_rodata)) {
+ if (A->getOption().matches(options::OPT_muninit_const_in_rodata)) {
+ CmdArgs.push_back("-muninit-const-in-rodata");
+ A->claim();
+ }
+ }
}
} else if ((!ABICalls || (!NoABICalls && ABICalls)) && WantGPOpt)
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp
index 003ea554713..cdc3b4b04a8 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -950,6 +950,8 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
Opts.Backchain = Args.hasArg(OPT_mbackchain);
+ Opts.UInitCstDataInROData = Args.hasArg(OPT_muninit_const_in_rodata);
+
Opts.EmitCheckPathComponentsToStrip = getLastArgIntValue(
Args, OPT_fsanitize_undefined_strip_path_components_EQ, 0, Diags);
diff --git a/clang/test/CodeGen/mips-uninit-const-in-ro.c b/clang/test/CodeGen/mips-uninit-const-in-ro.c
new file mode 100644
index 00000000000..62dc68637d7
--- /dev/null
+++ b/clang/test/CodeGen/mips-uninit-const-in-ro.c
@@ -0,0 +1,10 @@
+// RUN: %clang_cc1 -triple mips-mti--elf -emit-llvm -mrelocation-model static \
+// RUN: -target-feature +noabicalls -mllvm -mgpopt -mllvm \
+// RUN: -membedded-data=1 -muninit-const-in-rodata -o - %s | \
+// RUN: FileCheck %s
+
+// Test that -muninit-const-in-rodata places constant uninitialized structures
+// in the .rodata section rather than the commeon section.
+
+// CHECK: @a = global [8 x i32] zeroinitializer, section "rodata", align 4
+const int a[8];
OpenPOWER on IntegriCloud