[llvm] r187827 - Change the linkage of these global values to 'internal'.
Alexander Potapenko
glider at google.com
Thu Aug 8 04:19:23 PDT 2013
Looks like your commit has fixed
https://code.google.com/p/address-sanitizer/issues/detail?id=171. Yay!
On Wed, Aug 7, 2013 at 2:52 AM, Bill Wendling <isanbard at gmail.com> wrote:
> Author: void
> Date: Tue Aug 6 17:52:42 2013
> New Revision: 187827
>
> URL: http://llvm.org/viewvc/llvm-project?rev=187827&view=rev
> Log:
> Change the linkage of these global values to 'internal'.
>
> The globals being generated here were given the 'private' linkage type. However,
> this caused them to end up in different sections with the wrong prefix. E.g.,
> they would be in the __TEXT,__const section with an 'L' prefix instead of an 'l'
> (lowercase ell) prefix.
>
> The problem is that the linker will eat a literal label with 'L'. If a weak
> symbol is then placed into the __TEXT,__const section near that literal, then it
> cannot distinguish between the literal and the weak symbol.
>
> Part of the problems here was introduced because the address sanitizer converted
> some C strings into constant initializers with trailing nuls. (Thus putting them
> in the __const section with the wrong prefix.) The others were variables that
> the address sanitizer created but simply had the wrong linkage type.
>
> Modified:
> llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp
> llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-internal-globals.ll
>
> Modified: llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp?rev=187827&r1=187826&r2=187827&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp (original)
> +++ llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp Tue Aug 6 17:52:42 2013
> @@ -547,11 +547,11 @@ static size_t TypeSizeToSizeIndex(uint32
> return Res;
> }
>
> -// Create a constant for Str so that we can pass it to the run-time lib.
> +// \brief 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);
> GlobalVariable *GV = new GlobalVariable(M, StrConst->getType(), true,
> - GlobalValue::PrivateLinkage, StrConst,
> + GlobalValue::InternalLinkage, StrConst,
> kAsanGenPrefix);
> GV->setUnnamedAddr(true); // Ok to merge these.
> GV->setAlignment(1); // Strings may not be merged w/o setting align 1.
> @@ -961,8 +961,11 @@ bool AddressSanitizerModule::runOnModule
> GlobalVariable *Name = createPrivateGlobalForString(M, G->getName());
>
> // Create a new global variable with enough space for a redzone.
> + GlobalValue::LinkageTypes Linkage = G->getLinkage();
> + if (G->isConstant() && Linkage == GlobalValue::PrivateLinkage)
> + Linkage = GlobalValue::InternalLinkage;
> GlobalVariable *NewGlobal = new GlobalVariable(
> - M, NewTy, G->isConstant(), G->getLinkage(),
> + M, NewTy, G->isConstant(), Linkage,
> NewInitializer, "", G, G->getThreadLocalMode());
> NewGlobal->copyAttributesFrom(G);
> NewGlobal->setAlignment(MinRZ);
> @@ -995,7 +998,7 @@ bool AddressSanitizerModule::runOnModule
>
> ArrayType *ArrayOfGlobalStructTy = ArrayType::get(GlobalStructTy, n);
> GlobalVariable *AllGlobals = new GlobalVariable(
> - M, ArrayOfGlobalStructTy, false, GlobalVariable::PrivateLinkage,
> + M, ArrayOfGlobalStructTy, false, GlobalVariable::InternalLinkage,
> ConstantArray::get(ArrayOfGlobalStructTy, Initializers), "");
>
> // Create calls for poisoning before initializers run and unpoisoning after.
>
> Modified: llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-internal-globals.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-internal-globals.ll?rev=187827&r1=187826&r2=187827&view=diff
> ==============================================================================
> --- llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-internal-globals.ll (original)
> +++ llvm/trunk/test/Instrumentation/AddressSanitizer/do-not-instrument-internal-globals.ll Tue Aug 6 17:52:42 2013
> @@ -16,5 +16,5 @@ 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 unnamed_addr constant{{.*}}align 1
> -; CHECK-NOT: = private unnamed_addr constant
> +; CHECK: = internal unnamed_addr constant{{.*}}align 1
> +; CHECK-NOT: = internal unnamed_addr constant
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
--
Alexander Potapenko
Software Engineer
Google Moscow
More information about the llvm-commits
mailing list