Skip to content

Commit

Permalink
[MemProf] Make __memprof_shadow_memory_dynamic_address dso_local in s…
Browse files Browse the repository at this point in the history
…tatic relocation model

The x86-64 backend currently has a bug which uses a wrong register when for the GOTPCREL reference.
The program will crash without the dso_local specifier.
  • Loading branch information
MaskRay committed Dec 6, 2020
1 parent 1f21f6d commit 204d0d5
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 0 deletions.
2 changes: 2 additions & 0 deletions llvm/lib/Transforms/Instrumentation/MemProfiler.cpp
Expand Up @@ -576,6 +576,8 @@ bool MemProfiler::insertDynamicShadowAtFunctionEntry(Function &F) {
IRBuilder<> IRB(&F.front().front());
Value *GlobalDynamicAddress = F.getParent()->getOrInsertGlobal(
MemProfShadowMemoryDynamicAddress, IntptrTy);
if (F.getParent()->getPICLevel() == PICLevel::NotPIC)
dyn_cast<GlobalVariable>(GlobalDynamicAddress)->setDSOLocal(true);
DynamicShadowOffset = IRB.CreateLoad(IntptrTy, GlobalDynamicAddress);
return true;
}
Expand Down
14 changes: 14 additions & 0 deletions llvm/test/Instrumentation/HeapProfiler/shadow.ll
@@ -0,0 +1,14 @@
; RUN: opt < %s -passes='function(memprof),module(memprof-module)' -S | FileCheck --check-prefixes=STATIC %s

; RUN: cp %s %t.pic.ll
; RUN: echo -e '!llvm.module.flags = !{!0}\n!0 = !{i32 7, !"PIC Level", i32 1}' >> %t.pic.ll
; RUN: opt < %t.pic.ll -passes='function(memprof),module(memprof-module)' -S | FileCheck --check-prefixes=PIC %s

; STATIC: @__memprof_shadow_memory_dynamic_address = external dso_local global i64
; PIC: @__memprof_shadow_memory_dynamic_address = external global i64

define i32 @test_load(i32* %a) {
entry:
%tmp1 = load i32, i32* %a, align 4
ret i32 %tmp1
}

0 comments on commit 204d0d5

Please sign in to comment.