Skip to content

Commit 6834c70

Browse files
committed
Eliminate duplicate shadow stack pointer loads.
Shadow prologue before: ``` define dso_local ptr @getobjname(ptr noundef %0, i32 noundef %1, i32 noundef %2, ptr noundef %3) unnamed_addr rust-lang#29 !dbg !16937 { call void @__yk_trace_basicblock(i32 137, i32 0) %5 = load ptr, ptr @shadowstack_0, align 8 call void @llvm.dbg.value(metadata ptr %5, metadata !16961, metadata !DIExpression()), !dbg !16962 %6 = load ptr, ptr @shadowstack_0, align 8 %7 = getelementptr i8, ptr %6, i32 16 store ptr %7, ptr @shadowstack_0, align 8 ... ``` After: ``` define dso_local ptr @getobjname(ptr noundef %0, i32 noundef %1, i32 noundef %2, ptr noundef %3) unnamed_addr rust-lang#29 !dbg !16937 { call void @__yk_trace_basicblock(i32 137, i32 0) %5 = load ptr, ptr @shadowstack_0, align 8 call void @llvm.dbg.value(metadata ptr %5, metadata !16961, metadata !DIExpression()), !dbg !16962 %6 = getelementptr i8, ptr %5, i32 16 store ptr %6, ptr @shadowstack_0, align 8 ... ```
1 parent c8c275f commit 6834c70

File tree

1 file changed

+5
-11
lines changed

1 file changed

+5
-11
lines changed

llvm/lib/Transforms/Yk/ShadowStack.cpp

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,8 @@ class YkShadowStackImpl {
159159
// Insert a shadowstack_ptr debug variable when compiled with '-g' so that in
160160
// gdb we can know the offset into the shadow stack for each frame. This uses
161161
// llvm's debug intrinsic so does not affect optimized code.
162-
void insertShadowDbgInfo(Function &F, DataLayout &DL, size_t SFrameSize) {
162+
void insertShadowDbgInfo(Function &F, DataLayout &DL, size_t SFrameSize,
163+
Value *SSPtr) {
163164
DISubprogram *SP = F.getSubprogram();
164165
if (!SP) {
165166
return;
@@ -176,17 +177,10 @@ class YkShadowStackImpl {
176177
false, // AlwaysPreserve
177178
DINode::DIFlags::FlagArtificial);
178179

179-
// And insert it at the beginning of the function
180+
// And insert it after the load of the shadow stack pointer.
180181
DILocation *DIL = DILocation::get(F.getContext(), SP->getLine(), 0, SP);
181-
Instruction *InsertBefore = &*F.getEntryBlock().getFirstInsertionPt();
182-
Instruction *First = F.getEntryBlock().getFirstNonPHI();
183-
IRBuilder<> Builder(First);
184-
185-
// Load the shadow stack pointer out of the global variable and assign it
186-
// to our debug local.
187-
Value *SSPtr = Builder.CreateLoad(Int8PtrTy, ShadowCurrent);
188182
DIB->insertDbgValueIntrinsic(SSPtr, DebugVar, DIB->createExpression(), DIL,
189-
InsertBefore);
183+
cast<LoadInst>(SSPtr)->getNextNode());
190184
}
191185

192186
// Insert main's prologue.
@@ -474,7 +468,7 @@ class YkShadowStackImpl {
474468
size_t SFrameSize = analyseFunction(F, DL, Allocas, Rets);
475469
if (SFrameSize > 0) {
476470
Value *InitSSPtr = insertShadowPrologue(F, SFrameSize);
477-
insertShadowDbgInfo(F, DL, SFrameSize);
471+
insertShadowDbgInfo(F, DL, SFrameSize, InitSSPtr);
478472
rewriteAllocas(DL, Allocas, InitSSPtr);
479473
insertShadowEpilogues(Rets, InitSSPtr);
480474
}

0 commit comments

Comments
 (0)