@@ -156,12 +156,21 @@ class YkShadowStack : public ModulePass {
156
156
size_t AllocaSize = *AllocaSizeInBits / sizeof (uintptr_t );
157
157
size_t Align = AI.getAlign ().value ();
158
158
Offset = int ((Offset + (Align - 1 )) / Align) * Align;
159
- GetElementPtrInst *GEP = GetElementPtrInst::Create (
160
- Int8Ty, SSPtr, {ConstantInt::get (Int32Ty, Offset)}, " " ,
161
- cast<Instruction>(&AI));
162
- Builder.SetInsertPoint (GEP);
163
- Builder.CreateBitCast (GEP, AI.getAllocatedType ()->getPointerTo ());
164
- cast<Value>(I).replaceAllUsesWith (GEP);
159
+ if (Offset == 0 ) {
160
+ // If the offset is 0, we don't want to create `ptr_add
161
+ // %shadowstack, 0` as later parts of the pipeline are clever
162
+ // enough to recognise that as an alias: instead simply replace
163
+ // this variable with a direct reference to the shadow stack
164
+ // pointer.
165
+ cast<Value>(I).replaceAllUsesWith (SSPtr);
166
+ } else {
167
+ GetElementPtrInst *GEP = GetElementPtrInst::Create (
168
+ Int8Ty, SSPtr, {ConstantInt::get (Int32Ty, Offset)}, " " ,
169
+ cast<Instruction>(&AI));
170
+ Builder.SetInsertPoint (GEP);
171
+ Builder.CreateBitCast (GEP, AI.getAllocatedType ()->getPointerTo ());
172
+ cast<Value>(I).replaceAllUsesWith (GEP);
173
+ }
165
174
RemoveAllocas.push_back (cast<Instruction>(&AI));
166
175
Offset += AllocaSize;
167
176
} else if (isa<CallInst>(I)) {
0 commit comments