@@ -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