Skip to content

Commit f5b9e11

Browse files
authored
[SanitizerBinaryMetadata] Fix multi-version sanitizer metadata (#97848)
It should be valid to combine TUs that have different versions of sanitizer metadata. However, this had not been possible due to giving sanitizer metadata sections, constructors, and destructors (that call callbacks) the same name for different versions. This would then result in the linker attempting to merge sections that contain metadata of different versions, as well as picking any one of the constructors or destructors due to having the same COMDAT key. The end result is that consumers of this data would end up interpreting the metadata incorrectly. Although combining old and new versions is not recommended, more realistic is combining TUs that have been compiled with different target code models (which are also encoded in the sanitizer metadata version). To fix, and properly support multi-version sanitizer metadata, attach the version to section names and internal constructor and destructor names. The ABI remains unchanged.
1 parent 3851186 commit f5b9e11

File tree

6 files changed

+73
-61
lines changed

6 files changed

+73
-61
lines changed

clang/test/CodeGen/sanitize-metadata-ignorelist.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,6 @@ void bar() {
5050
__atomic_fetch_add(&y, 2, __ATOMIC_RELAXED);
5151
}
5252

53-
// ALLOW: __sanitizer_metadata_covered.module_ctor
54-
// FUN: __sanitizer_metadata_covered.module_ctor
55-
// SRC-NOT: __sanitizer_metadata_covered.module_ctor
53+
// ALLOW: __sanitizer_metadata_covered2.module_ctor
54+
// FUN: __sanitizer_metadata_covered2.module_ctor
55+
// SRC-NOT: __sanitizer_metadata_covered{{.*}}.module_ctor

clang/test/CodeGen/sanitize-metadata-nosanitize.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
// RUN: %clang_cc1 -O -fexperimental-sanitize-metadata=covered -fexperimental-sanitize-metadata=atomics -fexperimental-sanitize-metadata=uar -triple x86_64-gnu-linux -x c -emit-llvm %s -o - | FileCheck %s --check-prefixes=CHECK
33

44
//.
5-
// CHECK: @__start_sanmd_covered = extern_weak hidden global ptr
6-
// CHECK: @__stop_sanmd_covered = extern_weak hidden global ptr
7-
// CHECK: @__start_sanmd_atomics = extern_weak hidden global ptr
8-
// CHECK: @__stop_sanmd_atomics = extern_weak hidden global ptr
9-
// CHECK: @llvm.used = appending global [4 x ptr] [ptr @__sanitizer_metadata_covered.module_ctor, ptr @__sanitizer_metadata_covered.module_dtor, ptr @__sanitizer_metadata_atomics.module_ctor, ptr @__sanitizer_metadata_atomics.module_dtor], section "llvm.metadata"
10-
// CHECK: @llvm.global_ctors = appending global [2 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 2, ptr @__sanitizer_metadata_covered.module_ctor, ptr @__sanitizer_metadata_covered.module_ctor }, { i32, ptr, ptr } { i32 2, ptr @__sanitizer_metadata_atomics.module_ctor, ptr @__sanitizer_metadata_atomics.module_ctor }]
11-
// CHECK: @llvm.global_dtors = appending global [2 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 2, ptr @__sanitizer_metadata_covered.module_dtor, ptr @__sanitizer_metadata_covered.module_dtor }, { i32, ptr, ptr } { i32 2, ptr @__sanitizer_metadata_atomics.module_dtor, ptr @__sanitizer_metadata_atomics.module_dtor }]
5+
// CHECK: @__start_sanmd_covered2 = extern_weak hidden global ptr
6+
// CHECK: @__stop_sanmd_covered2 = extern_weak hidden global ptr
7+
// CHECK: @__start_sanmd_atomics2 = extern_weak hidden global ptr
8+
// CHECK: @__stop_sanmd_atomics2 = extern_weak hidden global ptr
9+
// CHECK: @llvm.used = appending global [4 x ptr] [ptr @__sanitizer_metadata_covered2.module_ctor, ptr @__sanitizer_metadata_covered2.module_dtor, ptr @__sanitizer_metadata_atomics2.module_ctor, ptr @__sanitizer_metadata_atomics2.module_dtor], section "llvm.metadata"
10+
// CHECK: @llvm.global_ctors = appending global [2 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 2, ptr @__sanitizer_metadata_covered2.module_ctor, ptr @__sanitizer_metadata_covered2.module_ctor }, { i32, ptr, ptr } { i32 2, ptr @__sanitizer_metadata_atomics2.module_ctor, ptr @__sanitizer_metadata_atomics2.module_ctor }]
11+
// CHECK: @llvm.global_dtors = appending global [2 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 2, ptr @__sanitizer_metadata_covered2.module_dtor, ptr @__sanitizer_metadata_covered2.module_dtor }, { i32, ptr, ptr } { i32 2, ptr @__sanitizer_metadata_atomics2.module_dtor, ptr @__sanitizer_metadata_atomics2.module_dtor }]
1212
//.
1313
// CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(write, argmem: none, inaccessiblemem: none)
1414
// CHECK-LABEL: define dso_local void @escape
@@ -95,17 +95,17 @@ __attribute__((no_sanitize("all"))) int test_no_sanitize_all(int *x, int *y) {
9595
// CHECK: attributes #3 = { mustprogress nofree norecurse nounwind willreturn memory(write, argmem: readwrite, inaccessiblemem: none) "min-legal-vector-width"="0" "no-trapping-math"="true" "no_sanitize_thread" "stack-protector-buffer-size"="8" "target-features"="+cx8,+mmx,+sse,+sse2,+x87" }
9696
// CHECK: attributes #4 = { nounwind "target-features"="+cx8,+mmx,+sse,+sse2,+x87" }
9797
//.
98-
// CHECK: !2 = !{!"sanmd_covered!C", !3}
98+
// CHECK: !2 = !{!"sanmd_covered2!C", !3}
9999
// CHECK: !3 = !{i64 0}
100-
// CHECK: !4 = !{!"sanmd_covered!C", !5}
100+
// CHECK: !4 = !{!"sanmd_covered2!C", !5}
101101
// CHECK: !5 = !{i64 3}
102102
// CHECK: !6 = !{!7, !7, i64 0}
103103
// CHECK: !7 = !{!"any pointer", !8, i64 0}
104104
// CHECK: !8 = !{!"omnipotent char", !9, i64 0}
105105
// CHECK: !9 = !{!"Simple C/C++ TBAA"}
106-
// CHECK: !10 = !{!"sanmd_atomics!C"}
106+
// CHECK: !10 = !{!"sanmd_atomics2!C"}
107107
// CHECK: !11 = !{!12, !12, i64 0}
108108
// CHECK: !12 = !{!"int", !8, i64 0}
109-
// CHECK: !13 = !{!"sanmd_covered!C", !14}
109+
// CHECK: !13 = !{!"sanmd_covered2!C", !14}
110110
// CHECK: !14 = !{i64 2}
111111
//.
Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
// RUN: %clang_cc1 -O -fexperimental-sanitize-metadata=atomics -triple x86_64-gnu-linux -x c -emit-llvm %s -o - | FileCheck %s --check-prefixes=CHECK,ATOMICS
22
// RUN: %clang_cc1 -O -fexperimental-sanitize-metadata=atomics -triple aarch64-gnu-linux -x c -emit-llvm %s -o - | FileCheck %s --check-prefixes=CHECK,ATOMICS
33

4-
// CHECK: @__start_sanmd_atomics = extern_weak hidden global ptr
5-
// CHECK: @__stop_sanmd_atomics = extern_weak hidden global ptr
6-
// CHECK: @__start_sanmd_covered = extern_weak hidden global ptr
7-
// CHECK: @__stop_sanmd_covered = extern_weak hidden global ptr
4+
// CHECK: @__start_sanmd_atomics2 = extern_weak hidden global ptr
5+
// CHECK: @__stop_sanmd_atomics2 = extern_weak hidden global ptr
6+
// CHECK: @__start_sanmd_covered2 = extern_weak hidden global ptr
7+
// CHECK: @__stop_sanmd_covered2 = extern_weak hidden global ptr
88

99
int x, y;
1010

@@ -21,16 +21,16 @@ int atomics() {
2121
__atomic_fetch_add(&x, 1, __ATOMIC_RELAXED);
2222
return y;
2323
}
24-
// ATOMICS-LABEL: __sanitizer_metadata_atomics.module_ctor
25-
// ATOMICS: call void @__sanitizer_metadata_atomics_add(i32 2, ptr @__start_sanmd_atomics, ptr @__stop_sanmd_atomics)
26-
// ATOMICS-LABEL: __sanitizer_metadata_atomics.module_dtor
27-
// ATOMICS: call void @__sanitizer_metadata_atomics_del(i32 2, ptr @__start_sanmd_atomics, ptr @__stop_sanmd_atomics)
24+
// ATOMICS-LABEL: __sanitizer_metadata_atomics2.module_ctor
25+
// ATOMICS: call void @__sanitizer_metadata_atomics_add(i32 2, ptr @__start_sanmd_atomics2, ptr @__stop_sanmd_atomics2)
26+
// ATOMICS-LABEL: __sanitizer_metadata_atomics2.module_dtor
27+
// ATOMICS: call void @__sanitizer_metadata_atomics_del(i32 2, ptr @__start_sanmd_atomics2, ptr @__stop_sanmd_atomics2)
2828

29-
// CHECK-LABEL: __sanitizer_metadata_covered.module_ctor
30-
// CHECK: call void @__sanitizer_metadata_covered_add(i32 2, ptr @__start_sanmd_covered, ptr @__stop_sanmd_covered)
31-
// CHECK-LABEL: __sanitizer_metadata_covered.module_dtor
32-
// CHECK: call void @__sanitizer_metadata_covered_del(i32 2, ptr @__start_sanmd_covered, ptr @__stop_sanmd_covered)
29+
// CHECK-LABEL: __sanitizer_metadata_covered2.module_ctor
30+
// CHECK: call void @__sanitizer_metadata_covered_add(i32 2, ptr @__start_sanmd_covered2, ptr @__stop_sanmd_covered2)
31+
// CHECK-LABEL: __sanitizer_metadata_covered2.module_dtor
32+
// CHECK: call void @__sanitizer_metadata_covered_del(i32 2, ptr @__start_sanmd_covered2, ptr @__stop_sanmd_covered2)
3333

34-
// ATOMICS: ![[ATOMICS_COVERED]] = !{!"sanmd_covered!C", ![[ATOMICS_COVERED_AUX:[0-9]+]]}
34+
// ATOMICS: ![[ATOMICS_COVERED]] = !{!"sanmd_covered2!C", ![[ATOMICS_COVERED_AUX:[0-9]+]]}
3535
// ATOMICS: ![[ATOMICS_COVERED_AUX]] = !{i64 1}
36-
// ATOMICS: ![[ATOMIC_OP]] = !{!"sanmd_atomics!C"}
36+
// ATOMICS: ![[ATOMIC_OP]] = !{!"sanmd_atomics2!C"}

llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "llvm/ADT/SetVector.h"
1515
#include "llvm/ADT/SmallVector.h"
1616
#include "llvm/ADT/Statistic.h"
17+
#include "llvm/ADT/StringExtras.h"
1718
#include "llvm/ADT/StringRef.h"
1819
#include "llvm/ADT/Twine.h"
1920
#include "llvm/Analysis/CaptureTracking.h"
@@ -130,7 +131,7 @@ class SanitizerBinaryMetadata {
130131
std::unique_ptr<SpecialCaseList> Ignorelist)
131132
: Mod(M), Options(transformOptionsFromCl(std::move(Opts))),
132133
Ignorelist(std::move(Ignorelist)), TargetTriple(M.getTargetTriple()),
133-
IRB(M.getContext()) {
134+
VersionStr(utostr(getVersion())), IRB(M.getContext()) {
134135
// FIXME: Make it work with other formats.
135136
assert(TargetTriple.isOSBinFormatELF() && "ELF only");
136137
assert(!(TargetTriple.isNVPTX() || TargetTriple.isAMDGPU()) &&
@@ -167,10 +168,10 @@ class SanitizerBinaryMetadata {
167168
StringRef getSectionName(StringRef SectionSuffix);
168169

169170
// Returns the section start marker name.
170-
Twine getSectionStart(StringRef SectionSuffix);
171+
StringRef getSectionStart(StringRef SectionSuffix);
171172

172173
// Returns the section end marker name.
173-
Twine getSectionEnd(StringRef SectionSuffix);
174+
StringRef getSectionEnd(StringRef SectionSuffix);
174175

175176
// Returns true if the access to the address should be considered "atomic".
176177
bool pretendAtomicAccess(const Value *Addr);
@@ -179,6 +180,7 @@ class SanitizerBinaryMetadata {
179180
const SanitizerBinaryMetadataOptions Options;
180181
std::unique_ptr<SpecialCaseList> Ignorelist;
181182
const Triple TargetTriple;
183+
const std::string VersionStr;
182184
IRBuilder<> IRB;
183185
BumpPtrAllocator Alloc;
184186
UniqueStringSaver StringPool{Alloc};
@@ -209,19 +211,25 @@ bool SanitizerBinaryMetadata::run() {
209211
getSectionMarker(getSectionStart(MI->SectionSuffix), PtrTy),
210212
getSectionMarker(getSectionEnd(MI->SectionSuffix), PtrTy),
211213
};
214+
215+
// Calls to the initialization functions with different versions cannot be
216+
// merged. Give the structors unique names based on the version, which will
217+
// also be used as the COMDAT key.
218+
const std::string StructorPrefix = (MI->FunctionPrefix + VersionStr).str();
219+
212220
// We declare the _add and _del functions as weak, and only call them if
213221
// there is a valid symbol linked. This allows building binaries with
214222
// semantic metadata, but without having callbacks. When a tool that wants
215223
// the metadata is linked which provides the callbacks, they will be called.
216224
Function *Ctor =
217225
createSanitizerCtorAndInitFunctions(
218-
Mod, (MI->FunctionPrefix + ".module_ctor").str(),
226+
Mod, StructorPrefix + ".module_ctor",
219227
(MI->FunctionPrefix + "_add").str(), InitTypes, InitArgs,
220228
/*VersionCheckName=*/StringRef(), /*Weak=*/ClWeakCallbacks)
221229
.first;
222230
Function *Dtor =
223231
createSanitizerCtorAndInitFunctions(
224-
Mod, (MI->FunctionPrefix + ".module_dtor").str(),
232+
Mod, StructorPrefix + ".module_dtor",
225233
(MI->FunctionPrefix + "_del").str(), InitTypes, InitArgs,
226234
/*VersionCheckName=*/StringRef(), /*Weak=*/ClWeakCallbacks)
227235
.first;
@@ -454,15 +462,19 @@ SanitizerBinaryMetadata::getSectionMarker(const Twine &MarkerName, Type *Ty) {
454462
StringRef SanitizerBinaryMetadata::getSectionName(StringRef SectionSuffix) {
455463
// FIXME: Other TargetTriples.
456464
// Request ULEB128 encoding for all integer constants.
457-
return StringPool.save(SectionSuffix + "!C");
465+
return StringPool.save(SectionSuffix + VersionStr + "!C");
458466
}
459467

460-
Twine SanitizerBinaryMetadata::getSectionStart(StringRef SectionSuffix) {
461-
return "__start_" + SectionSuffix;
468+
StringRef SanitizerBinaryMetadata::getSectionStart(StringRef SectionSuffix) {
469+
// Twine only concatenates 2 strings; with >2 strings, concatenating them
470+
// creates Twine temporaries, and returning the final Twine no longer works
471+
// because we'd end up with a stack-use-after-return. So here we also use the
472+
// StringPool to store the new string.
473+
return StringPool.save("__start_" + SectionSuffix + VersionStr);
462474
}
463475

464-
Twine SanitizerBinaryMetadata::getSectionEnd(StringRef SectionSuffix) {
465-
return "__stop_" + SectionSuffix;
476+
StringRef SanitizerBinaryMetadata::getSectionEnd(StringRef SectionSuffix) {
477+
return StringPool.save("__stop_" + SectionSuffix + VersionStr);
466478
}
467479

468480
} // namespace

llvm/test/Instrumentation/SanitizerBinaryMetadata/atomics.ll

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
; Check that atomic memory operations receive PC sections metadata.
44

5-
; CHECK: @__start_sanmd_atomics = extern_weak hidden global ptr
6-
; CHECK: @__stop_sanmd_atomics = extern_weak hidden global ptr
7-
; CHECK: @__start_sanmd_covered = extern_weak hidden global ptr
8-
; CHECK: @__stop_sanmd_covered = extern_weak hidden global ptr
5+
; CHECK: @__start_sanmd_atomics2 = extern_weak hidden global ptr
6+
; CHECK: @__stop_sanmd_atomics2 = extern_weak hidden global ptr
7+
; CHECK: @__start_sanmd_covered2 = extern_weak hidden global ptr
8+
; CHECK: @__stop_sanmd_covered2 = extern_weak hidden global ptr
99

1010
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
1111

@@ -2035,46 +2035,46 @@ entry:
20352035

20362036
; Check that callbacks are emitted.
20372037

2038-
; CHECK-LABEL: __sanitizer_metadata_atomics.module_ctor
2038+
; CHECK-LABEL: __sanitizer_metadata_atomics2.module_ctor
20392039
; CHECK-DAG: entry:
20402040
; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr @__sanitizer_metadata_atomics_add, null
20412041
; CHECK-NEXT: br i1 [[CMP]], label %callfunc, label %ret
20422042
; CHECK-DAG: callfunc:
2043-
; CHECK-NEXT: call void @__sanitizer_metadata_atomics_add(i32 2, ptr @__start_sanmd_atomics, ptr @__stop_sanmd_atomics)
2043+
; CHECK-NEXT: call void @__sanitizer_metadata_atomics_add(i32 2, ptr @__start_sanmd_atomics2, ptr @__stop_sanmd_atomics2)
20442044
; CHECK-NEXT: br label %ret
20452045
; CHECK-DAG: ret:
20462046
; CHECK-NEXT: ret void
20472047

2048-
; CHECK-LABEL: __sanitizer_metadata_atomics.module_dtor
2048+
; CHECK-LABEL: __sanitizer_metadata_atomics2.module_dtor
20492049
; CHECK-DAG: entry:
20502050
; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr @__sanitizer_metadata_atomics_del, null
20512051
; CHECK-NEXT: br i1 [[CMP]], label %callfunc, label %ret
20522052
; CHECK-DAG: callfunc:
2053-
; CHECK-NEXT: call void @__sanitizer_metadata_atomics_del(i32 2, ptr @__start_sanmd_atomics, ptr @__stop_sanmd_atomics)
2053+
; CHECK-NEXT: call void @__sanitizer_metadata_atomics_del(i32 2, ptr @__start_sanmd_atomics2, ptr @__stop_sanmd_atomics2)
20542054
; CHECK-NEXT: br label %ret
20552055
; CHECK-DAG: ret:
20562056
; CHECK-NEXT: ret void
20572057

2058-
; CHECK-LABEL: __sanitizer_metadata_covered.module_ctor
2058+
; CHECK-LABEL: __sanitizer_metadata_covered2.module_ctor
20592059
; CHECK-DAG: entry:
20602060
; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr @__sanitizer_metadata_covered_add, null
20612061
; CHECK-NEXT: br i1 [[CMP]], label %callfunc, label %ret
20622062
; CHECK-DAG: callfunc:
2063-
; CHECK-NEXT: call void @__sanitizer_metadata_covered_add(i32 2, ptr @__start_sanmd_covered, ptr @__stop_sanmd_covered)
2063+
; CHECK-NEXT: call void @__sanitizer_metadata_covered_add(i32 2, ptr @__start_sanmd_covered2, ptr @__stop_sanmd_covered2)
20642064
; CHECK-NEXT: br label %ret
20652065
; CHECK-DAG: ret:
20662066
; CHECK-NEXT: ret void
20672067

2068-
; CHECK-LABEL: __sanitizer_metadata_covered.module_dtor
2068+
; CHECK-LABEL: __sanitizer_metadata_covered2.module_dtor
20692069
; CHECK-DAG: entry:
20702070
; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr @__sanitizer_metadata_covered_del, null
20712071
; CHECK-NEXT: br i1 [[CMP]], label %callfunc, label %ret
20722072
; CHECK-DAG: callfunc:
2073-
; CHECK-NEXT: call void @__sanitizer_metadata_covered_del(i32 2, ptr @__start_sanmd_covered, ptr @__stop_sanmd_covered)
2073+
; CHECK-NEXT: call void @__sanitizer_metadata_covered_del(i32 2, ptr @__start_sanmd_covered2, ptr @__stop_sanmd_covered2)
20742074
; CHECK-NEXT: br label %ret
20752075
; CHECK-DAG: ret:
20762076
; CHECK-NEXT: ret void
20772077

2078-
; CHECK: !0 = !{!"sanmd_covered!C", !1}
2078+
; CHECK: !0 = !{!"sanmd_covered2!C", !1}
20792079
; CHECK: !1 = !{i64 1}
2080-
; CHECK: !2 = !{!"sanmd_atomics!C"}
2080+
; CHECK: !2 = !{!"sanmd_atomics2!C"}

llvm/test/Instrumentation/SanitizerBinaryMetadata/ctor.ll

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
; RUN: opt < %s -passes='module(sanmd-module)' -sanitizer-metadata-atomics -S | FileCheck %s
22

3-
; CHECK: $__sanitizer_metadata_atomics.module_ctor = comdat any
4-
; CHECK: $__sanitizer_metadata_atomics.module_dtor = comdat any
5-
; CHECK: $__sanitizer_metadata_covered.module_ctor = comdat any
6-
; CHECK: $__sanitizer_metadata_covered.module_dtor = comdat any
3+
; CHECK: $__sanitizer_metadata_atomics2.module_ctor = comdat any
4+
; CHECK: $__sanitizer_metadata_atomics2.module_dtor = comdat any
5+
; CHECK: $__sanitizer_metadata_covered2.module_ctor = comdat any
6+
; CHECK: $__sanitizer_metadata_covered2.module_dtor = comdat any
77

8-
; CHECK: @llvm.used = appending global [4 x ptr] [ptr @__sanitizer_metadata_atomics.module_ctor, ptr @__sanitizer_metadata_atomics.module_dtor, ptr @__sanitizer_metadata_covered.module_ctor, ptr @__sanitizer_metadata_covered.module_dtor], section "llvm.metadata"
9-
; CHECK: @llvm.global_ctors = appending global [2 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 2, ptr @__sanitizer_metadata_atomics.module_ctor, ptr @__sanitizer_metadata_atomics.module_ctor }, { i32, ptr, ptr } { i32 2, ptr @__sanitizer_metadata_covered.module_ctor, ptr @__sanitizer_metadata_covered.module_ctor }]
10-
; CHECK: @llvm.global_dtors = appending global [2 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 2, ptr @__sanitizer_metadata_atomics.module_dtor, ptr @__sanitizer_metadata_atomics.module_dtor }, { i32, ptr, ptr } { i32 2, ptr @__sanitizer_metadata_covered.module_dtor, ptr @__sanitizer_metadata_covered.module_dtor }]
8+
; CHECK: @llvm.used = appending global [4 x ptr] [ptr @__sanitizer_metadata_atomics2.module_ctor, ptr @__sanitizer_metadata_atomics2.module_dtor, ptr @__sanitizer_metadata_covered2.module_ctor, ptr @__sanitizer_metadata_covered2.module_dtor], section "llvm.metadata"
9+
; CHECK: @llvm.global_ctors = appending global [2 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 2, ptr @__sanitizer_metadata_atomics2.module_ctor, ptr @__sanitizer_metadata_atomics2.module_ctor }, { i32, ptr, ptr } { i32 2, ptr @__sanitizer_metadata_covered2.module_ctor, ptr @__sanitizer_metadata_covered2.module_ctor }]
10+
; CHECK: @llvm.global_dtors = appending global [2 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 2, ptr @__sanitizer_metadata_atomics2.module_dtor, ptr @__sanitizer_metadata_atomics2.module_dtor }, { i32, ptr, ptr } { i32 2, ptr @__sanitizer_metadata_covered2.module_dtor, ptr @__sanitizer_metadata_covered2.module_dtor }]
1111

12-
; CHECK: define hidden void @__sanitizer_metadata_covered.module_ctor() #1 comdat {
13-
; CHECK: define hidden void @__sanitizer_metadata_covered.module_dtor() #1 comdat {
12+
; CHECK: define hidden void @__sanitizer_metadata_covered2.module_ctor() #1 comdat {
13+
; CHECK: define hidden void @__sanitizer_metadata_covered2.module_dtor() #1 comdat {
1414

1515
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
1616
target triple = "x86_64-unknown-linux-gnu"

0 commit comments

Comments
 (0)