MS Compat: mark globals emitted in read-only sections const
They cannot be written to, so marking them const makes sense and may improve optimisation. As a side-effect, SectionInfos has to be moved from Sema to ASTContext. It also fixes this problem, that occurs when compiling ATL: warning LNK4254: section 'ATL' (C0000040) merged into '.rdata' (40000040) with different attributes The ATL headers are putting variables in a special section that's marked read-only. However, Clang currently can't model that read-onlyness in the IR. But, by making the variables const, the section does become read-only, and the linker warning is avoided. Differential Revision: http://reviews.llvm.org/D5812 llvm-svn: 219960
This commit is contained in:
@@ -1931,6 +1931,13 @@ void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) {
|
||||
GV->setConstant(!NeedsGlobalCtor && !NeedsGlobalDtor &&
|
||||
isTypeConstant(D->getType(), true));
|
||||
|
||||
// If it is in a read-only section, mark it 'constant'.
|
||||
if (const SectionAttr *SA = D->getAttr<SectionAttr>()) {
|
||||
const ASTContext::SectionInfo &SI = Context.SectionInfos[SA->getName()];
|
||||
if ((SI.SectionFlags & ASTContext::PSF_Write) == 0)
|
||||
GV->setConstant(true);
|
||||
}
|
||||
|
||||
GV->setAlignment(getContext().getDeclAlign(D).getQuantity());
|
||||
|
||||
// Set the llvm linkage type as appropriate.
|
||||
|
||||
Reference in New Issue
Block a user