aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/CodeGen/TargetInfo.cpp
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 /clang/lib/CodeGen/TargetInfo.cpp
parentb5563c6817de8c002f44b771410ea8ad3c3c9000 (diff)
downloadllvm-50f6d3545785b061ece2fad2355bc914912db7cc.zip
llvm-50f6d3545785b061ece2fad2355bc914912db7cc.tar.gz
llvm-50f6d3545785b061ece2fad2355bc914912db7cc.tar.bz2
[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
Diffstat (limited to 'clang/lib/CodeGen/TargetInfo.cpp')
-rw-r--r--clang/lib/CodeGen/TargetInfo.cpp14
1 files changed, 14 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp
index 1234143..473b312 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);