Skip to content

Commit dbc918b

Browse files
committed
Revert "[HWASan] do not replace lifetime intrinsics with tagged address."
Failed on buildbot: /home/buildbot/buildbot-root/llvm-clang-x86_64-sie-ubuntu-fast/build/bin/llc: error: : error: unable to get target for 'aarch64-unknown-linux-android29', see --version and --triple. FileCheck error: '<stdin>' is empty. FileCheck command line: /home/buildbot/buildbot-root/llvm-clang-x86_64-sie-ubuntu-fast/build/bin/FileCheck /home/buildbot/buildbot-root/llvm-project/llvm/test/Instrumentation/HWAddressSanitizer/stack-coloring.ll --check-prefix=COLOR This reverts commit 208b923.
1 parent d144cf5 commit dbc918b

File tree

4 files changed

+24
-94
lines changed

4 files changed

+24
-94
lines changed

llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp

Lines changed: 4 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
#include "llvm/Transforms/Instrumentation/HWAddressSanitizer.h"
1515
#include "llvm/ADT/MapVector.h"
16-
#include "llvm/ADT/STLExtras.h"
1716
#include "llvm/ADT/SmallVector.h"
1817
#include "llvm/ADT/StringExtras.h"
1918
#include "llvm/ADT/StringRef.h"
@@ -1302,11 +1301,6 @@ bool HWAddressSanitizer::instrumentLandingPads(
13021301
return true;
13031302
}
13041303

1305-
static bool isLifetimeIntrinsic(Value *V) {
1306-
auto *II = dyn_cast<IntrinsicInst>(V);
1307-
return II && II->isLifetimeStartOrEnd();
1308-
}
1309-
13101304
bool HWAddressSanitizer::instrumentStack(
13111305
memtag::StackInfo &SInfo, Value *StackTag,
13121306
llvm::function_ref<const DominatorTree &()> GetDT,
@@ -1332,32 +1326,8 @@ bool HWAddressSanitizer::instrumentStack(
13321326
AI->hasName() ? AI->getName().str() : "alloca." + itostr(N);
13331327
Replacement->setName(Name + ".hwasan");
13341328

1335-
size_t Size = memtag::getAllocaSizeInBytes(*AI);
1336-
size_t AlignedSize = alignTo(Size, Mapping.getObjectAlignment());
1337-
1338-
Value *AICast = IRB.CreatePointerCast(AI, Int8PtrTy);
1339-
1340-
auto HandleLifetime = [&](IntrinsicInst *II) {
1341-
// Set the lifetime intrinsic to cover the whole alloca. This reduces the
1342-
// set of assumptions we need to make about the lifetime. Without this we
1343-
// would need to ensure that we can track the lifetime pointer to a
1344-
// constant offset from the alloca, and would still need to change the
1345-
// size to include the extra alignment we use for the untagging to make
1346-
// the size consistent.
1347-
//
1348-
// The check for standard lifetime below makes sure that we have exactly
1349-
// one set of start / end in any execution (i.e. the ends are not
1350-
// reachable from each other), so this will not cause any problems.
1351-
II->setArgOperand(0, ConstantInt::get(Int64Ty, AlignedSize));
1352-
II->setArgOperand(1, AICast);
1353-
};
1354-
llvm::for_each(Info.LifetimeStart, HandleLifetime);
1355-
llvm::for_each(Info.LifetimeEnd, HandleLifetime);
1356-
1357-
AI->replaceUsesWithIf(Replacement, [AICast, AILong](Use &U) {
1358-
auto *User = U.getUser();
1359-
return User != AILong && User != AICast && !isLifetimeIntrinsic(User);
1360-
});
1329+
AI->replaceUsesWithIf(Replacement,
1330+
[AILong](Use &U) { return U.getUser() != AILong; });
13611331

13621332
for (auto *DDI : Info.DbgVariableIntrinsics) {
13631333
// Prepend "tag_offset, N" to the dwarf expression.
@@ -1371,6 +1341,8 @@ bool HWAddressSanitizer::instrumentStack(
13711341
NewOps, LocNo));
13721342
}
13731343

1344+
size_t Size = memtag::getAllocaSizeInBytes(*AI);
1345+
size_t AlignedSize = alignTo(Size, Mapping.getObjectAlignment());
13741346
auto TagEnd = [&](Instruction *Node) {
13751347
IRB.SetInsertPoint(Node);
13761348
Value *UARTag = getUARTag(IRB, StackTag);

llvm/test/Instrumentation/HWAddressSanitizer/exception-lifetime.ll

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,11 @@ entry:
2121
%0 = bitcast i32* %x to i8*
2222
call void @llvm.lifetime.start.p0i8(i64 8, i8* %0)
2323
invoke void @mayFail(i32* %x) to label %invoke.cont unwind label %lpad
24-
; CHECK: [[CAST:%.*]] = bitcast { i32, [12 x i8] }* %x to i32*
25-
; CHECK: [[TMP1:%.*]] = bitcast i32* {{.*}}[[CAST]] to i8*
2624

2725
invoke.cont: ; preds = %entry
2826
; CHECK: invoke.cont:
29-
; CHECK: call void @llvm.memset.p0i8.i64(i8* align 1 %{{.*}}, i8 0, i64 1, i1 false)
30-
; CHECK: call void @llvm.lifetime.end.p0i8(i64 16, i8* {{.*}}[[TMP1]])
27+
; CHECK: call void @llvm.memset.p0i8.i64(i8* align 1 %31, i8 0, i64 1, i1 false)
28+
; CHECK: call void @llvm.lifetime.end.p0i8(i64 8, i8* %28)
3129
; CHECK: ret void
3230

3331
%1 = bitcast i32* %x to i8*
@@ -36,8 +34,9 @@ invoke.cont: ; preds = %entry
3634

3735
lpad: ; preds = %entry
3836
; CHECK: lpad
39-
; CHECK: call void @llvm.memset.p0i8.i64(i8* align 1 %{{.*}}, i8 0, i64 1, i1 false)
40-
; CHECK: call void @llvm.lifetime.end.p0i8(i64 16, i8* {{.*}}[[TMP1]])
37+
; CHECK: %41 = getelementptr i8, i8* %17, i64 %40
38+
; CHECK: call void @llvm.memset.p0i8.i64(i8* align 1 %41, i8 0, i64 1, i1 false)
39+
; CHECK: call void @llvm.lifetime.end.p0i8(i64 8, i8* %38)
4140
; CHECK: br label %eh.resume
4241

4342
%2 = landingpad { i8*, i32 }

llvm/test/Instrumentation/HWAddressSanitizer/stack-coloring.ll

Lines changed: 0 additions & 41 deletions
This file was deleted.

llvm/test/Instrumentation/HWAddressSanitizer/use-after-scope.ll

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,12 @@ define dso_local i32 @standard_lifetime() local_unnamed_addr sanitize_hwaddress
3535
; X86-SCOPE-NEXT: [[ALLOCA_0_HWASAN:%.*]] = inttoptr i64 [[TMP7]] to i8*
3636
; X86-SCOPE-NEXT: br label [[TMP8:%.*]]
3737
; X86-SCOPE: 8:
38-
; X86-SCOPE-NEXT: call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull [[TMP2]])
38+
; X86-SCOPE-NEXT: call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull [[ALLOCA_0_HWASAN]])
3939
; X86-SCOPE-NEXT: [[TMP9:%.*]] = trunc i64 [[TMP4]] to i8
4040
; X86-SCOPE-NEXT: call void @__hwasan_tag_memory(i8* [[TMP2]], i8 [[TMP9]], i64 16)
4141
; X86-SCOPE-NEXT: [[TMP10:%.*]] = tail call i1 (...) @cond()
4242
; X86-SCOPE-NEXT: call void @__hwasan_tag_memory(i8* [[TMP2]], i8 0, i64 16)
43-
; X86-SCOPE-NEXT: call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull [[TMP2]])
43+
; X86-SCOPE-NEXT: call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull [[ALLOCA_0_HWASAN]])
4444
; X86-SCOPE-NEXT: br i1 [[TMP10]], label [[TMP11:%.*]], label [[TMP8]]
4545
; X86-SCOPE: 11:
4646
; X86-SCOPE-NEXT: call void @use(i8* nonnull [[ALLOCA_0_HWASAN]])
@@ -99,7 +99,7 @@ define dso_local i32 @standard_lifetime() local_unnamed_addr sanitize_hwaddress
9999
; AARCH64-SCOPE-NEXT: [[ALLOCA_0_HWASAN:%.*]] = inttoptr i64 [[TMP25]] to i8*
100100
; AARCH64-SCOPE-NEXT: br label [[TMP26:%.*]]
101101
; AARCH64-SCOPE: 26:
102-
; AARCH64-SCOPE-NEXT: call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull [[TMP20]])
102+
; AARCH64-SCOPE-NEXT: call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull [[ALLOCA_0_HWASAN]])
103103
; AARCH64-SCOPE-NEXT: [[TMP27:%.*]] = trunc i64 [[TMP22]] to i8
104104
; AARCH64-SCOPE-NEXT: [[TMP28:%.*]] = ptrtoint i8* [[TMP20]] to i64
105105
; AARCH64-SCOPE-NEXT: [[TMP29:%.*]] = lshr i64 [[TMP28]], 4
@@ -110,7 +110,7 @@ define dso_local i32 @standard_lifetime() local_unnamed_addr sanitize_hwaddress
110110
; AARCH64-SCOPE-NEXT: [[TMP33:%.*]] = lshr i64 [[TMP32]], 4
111111
; AARCH64-SCOPE-NEXT: [[TMP34:%.*]] = getelementptr i8, i8* [[TMP18]], i64 [[TMP33]]
112112
; AARCH64-SCOPE-NEXT: call void @llvm.memset.p0i8.i64(i8* align 1 [[TMP34]], i8 0, i64 1, i1 false)
113-
; AARCH64-SCOPE-NEXT: call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull [[TMP20]])
113+
; AARCH64-SCOPE-NEXT: call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull [[ALLOCA_0_HWASAN]])
114114
; AARCH64-SCOPE-NEXT: br i1 [[TMP31]], label [[TMP35:%.*]], label [[TMP26]]
115115
; AARCH64-SCOPE: 35:
116116
; AARCH64-SCOPE-NEXT: call void @use(i8* nonnull [[ALLOCA_0_HWASAN]])
@@ -195,7 +195,7 @@ define dso_local i32 @standard_lifetime() local_unnamed_addr sanitize_hwaddress
195195
; AARCH64-SHORT-SCOPE-NEXT: [[ALLOCA_0_HWASAN:%.*]] = inttoptr i64 [[TMP25]] to i8*
196196
; AARCH64-SHORT-SCOPE-NEXT: br label [[TMP26:%.*]]
197197
; AARCH64-SHORT-SCOPE: 26:
198-
; AARCH64-SHORT-SCOPE-NEXT: call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull [[TMP20]])
198+
; AARCH64-SHORT-SCOPE-NEXT: call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull [[ALLOCA_0_HWASAN]])
199199
; AARCH64-SHORT-SCOPE-NEXT: [[TMP27:%.*]] = trunc i64 [[TMP22]] to i8
200200
; AARCH64-SHORT-SCOPE-NEXT: [[TMP28:%.*]] = ptrtoint i8* [[TMP20]] to i64
201201
; AARCH64-SHORT-SCOPE-NEXT: [[TMP29:%.*]] = lshr i64 [[TMP28]], 4
@@ -209,7 +209,7 @@ define dso_local i32 @standard_lifetime() local_unnamed_addr sanitize_hwaddress
209209
; AARCH64-SHORT-SCOPE-NEXT: [[TMP35:%.*]] = lshr i64 [[TMP34]], 4
210210
; AARCH64-SHORT-SCOPE-NEXT: [[TMP36:%.*]] = getelementptr i8, i8* [[TMP18]], i64 [[TMP35]]
211211
; AARCH64-SHORT-SCOPE-NEXT: call void @llvm.memset.p0i8.i64(i8* align 1 [[TMP36]], i8 0, i64 1, i1 false)
212-
; AARCH64-SHORT-SCOPE-NEXT: call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull [[TMP20]])
212+
; AARCH64-SHORT-SCOPE-NEXT: call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull [[ALLOCA_0_HWASAN]])
213213
; AARCH64-SHORT-SCOPE-NEXT: br i1 [[TMP33]], label [[TMP37:%.*]], label [[TMP26]]
214214
; AARCH64-SHORT-SCOPE: 37:
215215
; AARCH64-SHORT-SCOPE-NEXT: call void @use(i8* nonnull [[ALLOCA_0_HWASAN]])
@@ -294,12 +294,12 @@ define dso_local i32 @standard_lifetime_optnone() local_unnamed_addr optnone noi
294294
; X86-SCOPE-NEXT: [[ALLOCA_0_HWASAN:%.*]] = inttoptr i64 [[TMP7]] to i8*
295295
; X86-SCOPE-NEXT: br label [[TMP8:%.*]]
296296
; X86-SCOPE: 8:
297-
; X86-SCOPE-NEXT: call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull [[TMP2]])
297+
; X86-SCOPE-NEXT: call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull [[ALLOCA_0_HWASAN]])
298298
; X86-SCOPE-NEXT: [[TMP9:%.*]] = trunc i64 [[TMP4]] to i8
299299
; X86-SCOPE-NEXT: call void @__hwasan_tag_memory(i8* [[TMP2]], i8 [[TMP9]], i64 16)
300300
; X86-SCOPE-NEXT: [[TMP10:%.*]] = tail call i1 (...) @cond()
301301
; X86-SCOPE-NEXT: call void @__hwasan_tag_memory(i8* [[TMP2]], i8 0, i64 16)
302-
; X86-SCOPE-NEXT: call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull [[TMP2]])
302+
; X86-SCOPE-NEXT: call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull [[ALLOCA_0_HWASAN]])
303303
; X86-SCOPE-NEXT: br i1 [[TMP10]], label [[TMP11:%.*]], label [[TMP8]]
304304
; X86-SCOPE: 11:
305305
; X86-SCOPE-NEXT: call void @use(i8* nonnull [[ALLOCA_0_HWASAN]])
@@ -358,7 +358,7 @@ define dso_local i32 @standard_lifetime_optnone() local_unnamed_addr optnone noi
358358
; AARCH64-SCOPE-NEXT: [[ALLOCA_0_HWASAN:%.*]] = inttoptr i64 [[TMP25]] to i8*
359359
; AARCH64-SCOPE-NEXT: br label [[TMP26:%.*]]
360360
; AARCH64-SCOPE: 26:
361-
; AARCH64-SCOPE-NEXT: call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull [[TMP20]])
361+
; AARCH64-SCOPE-NEXT: call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull [[ALLOCA_0_HWASAN]])
362362
; AARCH64-SCOPE-NEXT: [[TMP27:%.*]] = trunc i64 [[TMP22]] to i8
363363
; AARCH64-SCOPE-NEXT: [[TMP28:%.*]] = ptrtoint i8* [[TMP20]] to i64
364364
; AARCH64-SCOPE-NEXT: [[TMP29:%.*]] = lshr i64 [[TMP28]], 4
@@ -369,7 +369,7 @@ define dso_local i32 @standard_lifetime_optnone() local_unnamed_addr optnone noi
369369
; AARCH64-SCOPE-NEXT: [[TMP33:%.*]] = lshr i64 [[TMP32]], 4
370370
; AARCH64-SCOPE-NEXT: [[TMP34:%.*]] = getelementptr i8, i8* [[TMP18]], i64 [[TMP33]]
371371
; AARCH64-SCOPE-NEXT: call void @llvm.memset.p0i8.i64(i8* align 1 [[TMP34]], i8 0, i64 1, i1 false)
372-
; AARCH64-SCOPE-NEXT: call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull [[TMP20]])
372+
; AARCH64-SCOPE-NEXT: call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull [[ALLOCA_0_HWASAN]])
373373
; AARCH64-SCOPE-NEXT: br i1 [[TMP31]], label [[TMP35:%.*]], label [[TMP26]]
374374
; AARCH64-SCOPE: 35:
375375
; AARCH64-SCOPE-NEXT: call void @use(i8* nonnull [[ALLOCA_0_HWASAN]])
@@ -454,7 +454,7 @@ define dso_local i32 @standard_lifetime_optnone() local_unnamed_addr optnone noi
454454
; AARCH64-SHORT-SCOPE-NEXT: [[ALLOCA_0_HWASAN:%.*]] = inttoptr i64 [[TMP25]] to i8*
455455
; AARCH64-SHORT-SCOPE-NEXT: br label [[TMP26:%.*]]
456456
; AARCH64-SHORT-SCOPE: 26:
457-
; AARCH64-SHORT-SCOPE-NEXT: call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull [[TMP20]])
457+
; AARCH64-SHORT-SCOPE-NEXT: call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull [[ALLOCA_0_HWASAN]])
458458
; AARCH64-SHORT-SCOPE-NEXT: [[TMP27:%.*]] = trunc i64 [[TMP22]] to i8
459459
; AARCH64-SHORT-SCOPE-NEXT: [[TMP28:%.*]] = ptrtoint i8* [[TMP20]] to i64
460460
; AARCH64-SHORT-SCOPE-NEXT: [[TMP29:%.*]] = lshr i64 [[TMP28]], 4
@@ -468,7 +468,7 @@ define dso_local i32 @standard_lifetime_optnone() local_unnamed_addr optnone noi
468468
; AARCH64-SHORT-SCOPE-NEXT: [[TMP35:%.*]] = lshr i64 [[TMP34]], 4
469469
; AARCH64-SHORT-SCOPE-NEXT: [[TMP36:%.*]] = getelementptr i8, i8* [[TMP18]], i64 [[TMP35]]
470470
; AARCH64-SHORT-SCOPE-NEXT: call void @llvm.memset.p0i8.i64(i8* align 1 [[TMP36]], i8 0, i64 1, i1 false)
471-
; AARCH64-SHORT-SCOPE-NEXT: call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull [[TMP20]])
471+
; AARCH64-SHORT-SCOPE-NEXT: call void @llvm.lifetime.end.p0i8(i64 1, i8* nonnull [[ALLOCA_0_HWASAN]])
472472
; AARCH64-SHORT-SCOPE-NEXT: br i1 [[TMP33]], label [[TMP37:%.*]], label [[TMP26]]
473473
; AARCH64-SHORT-SCOPE: 37:
474474
; AARCH64-SHORT-SCOPE-NEXT: call void @use(i8* nonnull [[ALLOCA_0_HWASAN]])
@@ -776,7 +776,7 @@ define dso_local i32 @unreachable_exit() local_unnamed_addr sanitize_hwaddress {
776776
; X86-SCOPE-NEXT: [[TMP6:%.*]] = shl i64 [[TMP4]], 57
777777
; X86-SCOPE-NEXT: [[TMP7:%.*]] = or i64 [[TMP5]], [[TMP6]]
778778
; X86-SCOPE-NEXT: [[ALLOCA_0_HWASAN:%.*]] = inttoptr i64 [[TMP7]] to i8*
779-
; X86-SCOPE-NEXT: call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull [[TMP2]])
779+
; X86-SCOPE-NEXT: call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull [[ALLOCA_0_HWASAN]])
780780
; X86-SCOPE-NEXT: [[TMP8:%.*]] = trunc i64 [[TMP4]] to i8
781781
; X86-SCOPE-NEXT: call void @__hwasan_tag_memory(i8* [[TMP2]], i8 [[TMP8]], i64 16)
782782
; X86-SCOPE-NEXT: [[TMP9:%.*]] = tail call i1 (...) @cond()
@@ -841,7 +841,7 @@ define dso_local i32 @unreachable_exit() local_unnamed_addr sanitize_hwaddress {
841841
; AARCH64-SCOPE-NEXT: [[TMP24:%.*]] = shl i64 [[TMP22]], 56
842842
; AARCH64-SCOPE-NEXT: [[TMP25:%.*]] = or i64 [[TMP23]], [[TMP24]]
843843
; AARCH64-SCOPE-NEXT: [[ALLOCA_0_HWASAN:%.*]] = inttoptr i64 [[TMP25]] to i8*
844-
; AARCH64-SCOPE-NEXT: call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull [[TMP20]])
844+
; AARCH64-SCOPE-NEXT: call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull [[ALLOCA_0_HWASAN]])
845845
; AARCH64-SCOPE-NEXT: [[TMP26:%.*]] = trunc i64 [[TMP22]] to i8
846846
; AARCH64-SCOPE-NEXT: [[TMP27:%.*]] = ptrtoint i8* [[TMP20]] to i64
847847
; AARCH64-SCOPE-NEXT: [[TMP28:%.*]] = lshr i64 [[TMP27]], 4
@@ -944,7 +944,7 @@ define dso_local i32 @unreachable_exit() local_unnamed_addr sanitize_hwaddress {
944944
; AARCH64-SHORT-SCOPE-NEXT: [[TMP24:%.*]] = shl i64 [[TMP22]], 56
945945
; AARCH64-SHORT-SCOPE-NEXT: [[TMP25:%.*]] = or i64 [[TMP23]], [[TMP24]]
946946
; AARCH64-SHORT-SCOPE-NEXT: [[ALLOCA_0_HWASAN:%.*]] = inttoptr i64 [[TMP25]] to i8*
947-
; AARCH64-SHORT-SCOPE-NEXT: call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull [[TMP20]])
947+
; AARCH64-SHORT-SCOPE-NEXT: call void @llvm.lifetime.start.p0i8(i64 1, i8* nonnull [[ALLOCA_0_HWASAN]])
948948
; AARCH64-SHORT-SCOPE-NEXT: [[TMP26:%.*]] = trunc i64 [[TMP22]] to i8
949949
; AARCH64-SHORT-SCOPE-NEXT: [[TMP27:%.*]] = ptrtoint i8* [[TMP20]] to i64
950950
; AARCH64-SHORT-SCOPE-NEXT: [[TMP28:%.*]] = lshr i64 [[TMP27]], 4

0 commit comments

Comments
 (0)