summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib')
-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
3 files changed, 24 insertions, 0 deletions
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);
OpenPOWER on IntegriCloud