[asan] when creating string constants, set unnamed_attr and align 1 so that equal strings are merged by the linker. Observed up to 1% binary size reduction. Thanks to Anton Korobeynikov for the suggestion

llvm-svn: 177264
This commit is contained in:
Kostya Serebryany 2013-03-18 09:38:39 +00:00
parent 6488b2b257
commit 10cc12f2b7
2 changed files with 7 additions and 3 deletions

View File

@ -531,9 +531,12 @@ static size_t TypeSizeToSizeIndex(uint32_t TypeSize) {
// Create a constant for Str so that we can pass it to the run-time lib.
static GlobalVariable *createPrivateGlobalForString(Module &M, StringRef Str) {
Constant *StrConst = ConstantDataArray::getString(M.getContext(), Str);
return new GlobalVariable(M, StrConst->getType(), true,
GlobalVariable *GV = new GlobalVariable(M, StrConst->getType(), true,
GlobalValue::PrivateLinkage, StrConst,
kAsanGenPrefix);
GV->setUnnamedAddr(true); // Ok to merge these.
GV->setAlignment(1); // Strings may not be merged w/o setting align 1.
return GV;
}
static bool GlobalWasGeneratedByAsan(GlobalVariable *G) {

View File

@ -14,6 +14,7 @@ entry:
declare void @_Z3fooPi(i32*)
; We create one global string constant for the stack frame above.
; It should have unnamed_addr and align 1.
; Make sure we don't create any other global constants.
; CHECK: = private constant
; CHECK-NOT: = private constant
; CHECK: = private unnamed_addr constant{{.*}}align 1
; CHECK-NOT: = private unnamed_addr constant