Skip to content

Commit a4767e6

Browse files
authored
[MemorySanitizer] Use getelementptr instead of ptrtoint+add+inttoptr (#161392)
MemorySanitizer currently does a lot of pointer arithmetic using ptrtoint+add+inttoptr instead of using getelementptr. As far as I can tell, there is no need to use this pattern -- msan is not trying to synthesize pointers with different provenance here. The pointers in question stay within one object (like the TLS parameter area). I suspect that this is just a leftover from pre-opaque-pointer types where this was a natural way to perform offset arithmetic. Nowadays we should just emit a getelementptr i8, aka ptradd.
1 parent 912a92a commit a4767e6

File tree

93 files changed

+8761
-9041
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

93 files changed

+8761
-9041
lines changed

llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp

Lines changed: 18 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1923,20 +1923,17 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
19231923
///
19241924
/// Shadow = ParamTLS+ArgOffset.
19251925
Value *getShadowPtrForArgument(IRBuilder<> &IRB, int ArgOffset) {
1926-
Value *Base = IRB.CreatePointerCast(MS.ParamTLS, MS.IntptrTy);
1927-
if (ArgOffset)
1928-
Base = IRB.CreateAdd(Base, ConstantInt::get(MS.IntptrTy, ArgOffset));
1929-
return IRB.CreateIntToPtr(Base, IRB.getPtrTy(0), "_msarg");
1926+
return IRB.CreatePtrAdd(MS.ParamTLS,
1927+
ConstantInt::get(MS.IntptrTy, ArgOffset), "_msarg");
19301928
}
19311929

19321930
/// Compute the origin address for a given function argument.
19331931
Value *getOriginPtrForArgument(IRBuilder<> &IRB, int ArgOffset) {
19341932
if (!MS.TrackOrigins)
19351933
return nullptr;
1936-
Value *Base = IRB.CreatePointerCast(MS.ParamOriginTLS, MS.IntptrTy);
1937-
if (ArgOffset)
1938-
Base = IRB.CreateAdd(Base, ConstantInt::get(MS.IntptrTy, ArgOffset));
1939-
return IRB.CreateIntToPtr(Base, IRB.getPtrTy(0), "_msarg_o");
1934+
return IRB.CreatePtrAdd(MS.ParamOriginTLS,
1935+
ConstantInt::get(MS.IntptrTy, ArgOffset),
1936+
"_msarg_o");
19401937
}
19411938

19421939
/// Compute the shadow address for a retval.
@@ -7219,9 +7216,8 @@ struct VarArgHelperBase : public VarArgHelper {
72197216

72207217
/// Compute the shadow address for a given va_arg.
72217218
Value *getShadowPtrForVAArgument(IRBuilder<> &IRB, unsigned ArgOffset) {
7222-
Value *Base = IRB.CreatePointerCast(MS.VAArgTLS, MS.IntptrTy);
7223-
Base = IRB.CreateAdd(Base, ConstantInt::get(MS.IntptrTy, ArgOffset));
7224-
return IRB.CreateIntToPtr(Base, MS.PtrTy, "_msarg_va_s");
7219+
return IRB.CreatePtrAdd(
7220+
MS.VAArgTLS, ConstantInt::get(MS.IntptrTy, ArgOffset), "_msarg_va_s");
72257221
}
72267222

72277223
/// Compute the shadow address for a given va_arg.
@@ -7235,12 +7231,12 @@ struct VarArgHelperBase : public VarArgHelper {
72357231

72367232
/// Compute the origin address for a given va_arg.
72377233
Value *getOriginPtrForVAArgument(IRBuilder<> &IRB, int ArgOffset) {
7238-
Value *Base = IRB.CreatePointerCast(MS.VAArgOriginTLS, MS.IntptrTy);
72397234
// getOriginPtrForVAArgument() is always called after
72407235
// getShadowPtrForVAArgument(), so __msan_va_arg_origin_tls can never
72417236
// overflow.
7242-
Base = IRB.CreateAdd(Base, ConstantInt::get(MS.IntptrTy, ArgOffset));
7243-
return IRB.CreateIntToPtr(Base, MS.PtrTy, "_msarg_va_o");
7237+
return IRB.CreatePtrAdd(MS.VAArgOriginTLS,
7238+
ConstantInt::get(MS.IntptrTy, ArgOffset),
7239+
"_msarg_va_o");
72447240
}
72457241

72467242
void CleanUnusedTLS(IRBuilder<> &IRB, Value *ShadowBase,
@@ -7467,10 +7463,8 @@ struct VarArgAMD64Helper : public VarArgHelperBase {
74677463
NextNodeIRBuilder IRB(OrigInst);
74687464
Value *VAListTag = OrigInst->getArgOperand(0);
74697465

7470-
Value *RegSaveAreaPtrPtr = IRB.CreateIntToPtr(
7471-
IRB.CreateAdd(IRB.CreatePtrToInt(VAListTag, MS.IntptrTy),
7472-
ConstantInt::get(MS.IntptrTy, 16)),
7473-
MS.PtrTy);
7466+
Value *RegSaveAreaPtrPtr =
7467+
IRB.CreatePtrAdd(VAListTag, ConstantInt::get(MS.IntptrTy, 16));
74747468
Value *RegSaveAreaPtr = IRB.CreateLoad(MS.PtrTy, RegSaveAreaPtrPtr);
74757469
Value *RegSaveAreaShadowPtr, *RegSaveAreaOriginPtr;
74767470
const Align Alignment = Align(16);
@@ -7482,10 +7476,8 @@ struct VarArgAMD64Helper : public VarArgHelperBase {
74827476
if (MS.TrackOrigins)
74837477
IRB.CreateMemCpy(RegSaveAreaOriginPtr, Alignment, VAArgTLSOriginCopy,
74847478
Alignment, AMD64FpEndOffset);
7485-
Value *OverflowArgAreaPtrPtr = IRB.CreateIntToPtr(
7486-
IRB.CreateAdd(IRB.CreatePtrToInt(VAListTag, MS.IntptrTy),
7487-
ConstantInt::get(MS.IntptrTy, 8)),
7488-
MS.PtrTy);
7479+
Value *OverflowArgAreaPtrPtr =
7480+
IRB.CreatePtrAdd(VAListTag, ConstantInt::get(MS.IntptrTy, 8));
74897481
Value *OverflowArgAreaPtr =
74907482
IRB.CreateLoad(MS.PtrTy, OverflowArgAreaPtrPtr);
74917483
Value *OverflowArgAreaShadowPtr, *OverflowArgAreaOriginPtr;
@@ -7615,19 +7607,15 @@ struct VarArgAArch64Helper : public VarArgHelperBase {
76157607

76167608
// Retrieve a va_list field of 'void*' size.
76177609
Value *getVAField64(IRBuilder<> &IRB, Value *VAListTag, int offset) {
7618-
Value *SaveAreaPtrPtr = IRB.CreateIntToPtr(
7619-
IRB.CreateAdd(IRB.CreatePtrToInt(VAListTag, MS.IntptrTy),
7620-
ConstantInt::get(MS.IntptrTy, offset)),
7621-
MS.PtrTy);
7610+
Value *SaveAreaPtrPtr =
7611+
IRB.CreatePtrAdd(VAListTag, ConstantInt::get(MS.IntptrTy, offset));
76227612
return IRB.CreateLoad(Type::getInt64Ty(*MS.C), SaveAreaPtrPtr);
76237613
}
76247614

76257615
// Retrieve a va_list field of 'int' size.
76267616
Value *getVAField32(IRBuilder<> &IRB, Value *VAListTag, int offset) {
7627-
Value *SaveAreaPtr = IRB.CreateIntToPtr(
7628-
IRB.CreateAdd(IRB.CreatePtrToInt(VAListTag, MS.IntptrTy),
7629-
ConstantInt::get(MS.IntptrTy, offset)),
7630-
MS.PtrTy);
7617+
Value *SaveAreaPtr =
7618+
IRB.CreatePtrAdd(VAListTag, ConstantInt::get(MS.IntptrTy, offset));
76317619
Value *SaveArea32 = IRB.CreateLoad(IRB.getInt32Ty(), SaveAreaPtr);
76327620
return IRB.CreateSExt(SaveArea32, MS.IntptrTy);
76337621
}

0 commit comments

Comments
 (0)