Skip to content

Commit 976a9e5

Browse files
committed
add test, use MapVector, set section for LLVM::GlobalOp
1 parent 6c76af5 commit 976a9e5

File tree

3 files changed

+175
-4
lines changed

3 files changed

+175
-4
lines changed

clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ struct LoweringPreparePass : public LoweringPrepareBase<LoweringPreparePass> {
155155
/// List of annotations in the module, need to be a map with value GlobalOp
156156
/// as we need view to annotated GlobalOp to create global annotation var
157157
/// and one GlobalOp could have multiple AnnotateAttr
158-
llvm::DenseMap<mlir::Attribute, mlir::Operation *> globalAnnotations;
158+
llvm::MapVector<mlir::Attribute, mlir::Operation *> globalAnnotations;
159159
};
160160
} // namespace
161161

@@ -1144,14 +1144,14 @@ void LoweringPreparePass::buildGlobalAnnotationVars() {
11441144
globalAnnotationsVec.reserve(globalAnnotations.size());
11451145

11461146
for (auto &annotEntry : globalAnnotations) {
1147-
auto annotation = dyn_cast<AnnotationAttr>(annotEntry.getFirst());
1147+
auto annotation = dyn_cast<AnnotationAttr>(annotEntry.first);
11481148
if (!annotation)
11491149
continue;
11501150
mlir::cir::GlobalViewAttr globalValueView;
1151-
if (auto global = dyn_cast<GlobalOp>(annotEntry.getSecond())) {
1151+
if (auto global = dyn_cast<GlobalOp>(annotEntry.second)) {
11521152
globalValueView =
11531153
builder.getGlobalViewAttr(builder.getVoidPtrTy(), global);
1154-
} else if (auto func = dyn_cast<FuncOp>(annotEntry.getSecond())) {
1154+
} else if (auto func = dyn_cast<FuncOp>(annotEntry.second)) {
11551155
globalValueView = builder.getGlobalViewAttr(builder.getVoidPtrTy(), func);
11561156
} else {
11571157
continue;

clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1922,6 +1922,8 @@ class CIRGlobalOpLowering
19221922
/*addrSpace*/ getGlobalOpTargetAddrSpace(op),
19231923
/*dsoLocal*/ false, /*threadLocal*/ (bool)op.getTlsModelAttr(),
19241924
/*comdat*/ mlir::SymbolRefAttr(), attributes);
1925+
if (op.getSection())
1926+
newGlobalOp.setSection(op.getSection());
19251927
newGlobalOp.getRegion().push_back(new mlir::Block());
19261928
rewriter.setInsertionPointToEnd(newGlobalOp.getInitializerBlock());
19271929
}
Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
// RUN: %clang_cc1 -triple aarch64-none-linux-android21 -fclangir -emit-cir -mmlir --mlir-print-ir-before=cir-lowering-prepare %s -o %t.cir 2>&1 | FileCheck %s -check-prefix=BEFORE
2+
// RUN: %clang_cc1 -triple aarch64-none-linux-android21 -fclangir -emit-cir -mmlir --mlir-print-ir-after=cir-lowering-prepare %s -o %t.cir 2>&1 | FileCheck %s -check-prefix=AFTER
3+
// RUN: %clang_cc1 -triple aarch64-none-linux-android21 -fclangir -emit-llvm %s -o %t.ll
4+
// RUN: FileCheck --input-file=%t.ll %s -check-prefix=LLVM
5+
double *a __attribute__((annotate("withargs", "21", 12 )));
6+
int *b __attribute__((annotate("withargs", "21", 12 )));
7+
void *c __attribute__((annotate("noargvar")));
8+
void foo(int i) __attribute__((annotate("noargfunc"))) {
9+
}
10+
// redeclare with more annotate
11+
void foo(int i) __attribute__((annotate("withargfunc", "os", 23 )));
12+
void bar() __attribute__((annotate("withargfunc", "os", 22))) {
13+
}
14+
15+
// BEFORE: cir.global external @a = #cir.ptr<null> : !cir.ptr<!cir.double>
16+
// BEFORE-SAME: [#cir.annotation<name = <"withargs" : !cir.array<!s8i x 8>>,
17+
// BEFORE-SAME: unit = <"[[PATH:.*]]attribute-annotate-multiple.cpp" :
18+
// BEFORE-SAME: !cir.array<!s8i x [[FILENAME_LEN:[0-9]+]]>>,
19+
// BEFORE-SAME: lineno = <5>, args = #cir.const_struct<{#cir.global_view<@".str">
20+
// BEFORE-SAME: : !cir.ptr<!cir.array<!s8i x 3>>, #cir.int<12> : !s32i}>
21+
// BEFORE: cir.global "private" constant internal dsolocal @".str" =
22+
// BEFORE-SAME: #cir.const_array<"21\00" : !cir.array<!s8i x 3>> :
23+
// BEFORE-SAME: !cir.array<!s8i x 3> {alignment = 1 : i64}
24+
// BEFORE: cir.global external @b = #cir.ptr<null> : !cir.ptr<!s32i>
25+
// BEFORE-SAME: [#cir.annotation<name = <"withargs" : !cir.array<!s8i x 8>>,
26+
// BEFORE-SAME: unit = <"[[PATH]]attribute-annotate-multiple.cpp" :
27+
// BEFORE-SAME: !cir.array<!s8i x [[FILENAME_LEN]]>>,
28+
// BEFORE-SAME: lineno = <6>, args = #cir.const_struct<{#cir.global_view<@".str">
29+
// BEFORE-SAME: : !cir.ptr<!cir.array<!s8i x 3>>, #cir.int<12> : !s32i}>
30+
// BEFORE: cir.global external @c = #cir.ptr<null> : !cir.ptr<!void>
31+
// BEFORE-SAME: [#cir.annotation<name = <"noargvar" : !cir.array<!s8i x 8>>,
32+
// BEFORE-SAME: unit = <"[[PATH]]attribute-annotate-multiple.cpp" :
33+
// BEFORE-SAME: !cir.array<!s8i x [[FILENAME_LEN]]>>,
34+
// BEFORE-SAME: lineno = <7>, args = #cir.zero : !cir.ptr<!void>>]
35+
// BEFORE: cir.func @_Z3fooi(%arg0: !s32i) attributes {annotates =
36+
// BEFORE-SAME: [#cir.annotation<name = <"noargfunc" : !cir.array<!s8i x 9>>,
37+
// BEFORE-SAME: unit = <"[[PATH]]attribute-annotate-multiple.cpp" :
38+
// BEFORE-SAME: !cir.array<!s8i x [[FILENAME_LEN]]>>,
39+
// BEFORE-SAME: lineno = <11>, args = #cir.zero : !cir.ptr<!void>>,
40+
// BEFORE-SAME: #cir.annotation<name = <"withargfunc" : !cir.array<!s8i x 11>>,
41+
// BEFORE-SAME: unit = <"[[PATH]]attribute-annotate-multiple.cpp" :
42+
// BEFORE-SAME: !cir.array<!s8i x [[FILENAME_LEN]]>>,
43+
// BEFORE-SAME: lineno = <11>, args = #cir.const_struct<{#cir.global_view<@".str1"> :
44+
// BEFORE-SAME: !cir.ptr<!cir.array<!s8i x 3>>, #cir.int<23> : !s32i}>
45+
// BEFORE: cir.func @_Z3barv() attributes {annotates =
46+
// BEFORE-SAME: [#cir.annotation<name = <"withargfunc" : !cir.array<!s8i x 11>>,
47+
// BEFORE-SAME: unit = <"[[PATH]]attribute-annotate-multiple.cpp" :
48+
// BEFORE-SAME: !cir.array<!s8i x [[FILENAME_LEN]]>>,
49+
// BEFORE-SAME: lineno = <12>, args = #cir.const_struct<{#cir.global_view<@".str1"> :
50+
// BEFORE-SAME: !cir.ptr<!cir.array<!s8i x 3>>, #cir.int<22> : !s32i}>
51+
// BEFORE: cir.global "private" constant internal dsolocal @".str1"
52+
// BEFORE-SAME: #cir.const_array<"os\00" : !cir.array<!s8i x 3>> :
53+
// BEFORE-SAME: !cir.array<!s8i x 3> {alignment = 1 : i64}
54+
55+
// AFTER: ![[ANNO_STRUCT_T0:.*]] = !cir.struct<struct {!cir.ptr<!cir.void>,
56+
// AFTER-SAME: !cir.ptr<!cir.void>, !cir.ptr<!cir.void>, !cir.int<u, 32>, !cir.ptr<!cir.void>}>
57+
// AFTER: ![[ANNO_STRUCT_T1:.*]] = !cir.struct<struct {!cir.ptr<!cir.array<!cir.int<s, 8> x 3>>, !cir.int<s, 32>}>
58+
// AFTER: cir.global "private" constant cir_private dsolocal @".str.0.llvm.metadata" =
59+
// AFTER-SAME: #cir.const_array<"withargs" : !cir.array<!s8i x 8>> :
60+
// AFTER-SAME: !cir.array<!s8i x 8> {section = "llvm.metadata"}
61+
// AFTER: cir.global "private" constant cir_private dsolocal @".str.1.llvm.metadata" =
62+
// AFTER-SAME: #cir.const_array<"[[PATH:.*]]attribute-annotate-multiple.cpp" :
63+
// AFTER-SAME: !cir.array<!s8i x [[FILENAME_LEN:[0-9]+]]>> :
64+
// AFTER-SAME: !cir.array<!s8i x [[FILENAME_LEN]]> {section = "llvm.metadata"}
65+
// AFTER: cir.global "private" constant cir_private dsolocal @".args.0.llvm.metadata" =
66+
// AFTER-SAME: #cir.const_struct<{#cir.global_view<@".str"> :
67+
// AFTER-SAME: !cir.ptr<!cir.array<!s8i x 3>>, #cir.int<12> : !s32i}> :
68+
// AFTER-SAME: ![[ANNO_STRUCT_T1]] {section = "llvm.metadata"}
69+
// AFTER: cir.global "private" constant cir_private dsolocal @".str.2.llvm.metadata" =
70+
// AFTER-SAME: #cir.const_array<"noargvar" : !cir.array<!s8i x 8>> :
71+
// AFTER-SAME: !cir.array<!s8i x 8> {section = "llvm.metadata"}
72+
// AFTER: cir.global "private" constant cir_private dsolocal @".str.3.llvm.metadata" =
73+
// AFTER-SAME: #cir.const_array<"noargfunc" : !cir.array<!s8i x 9>> :
74+
// AFTER-SAME: !cir.array<!s8i x 9> {section = "llvm.metadata"}
75+
// AFTER: cir.global "private" constant cir_private dsolocal @".str.4.llvm.metadata" =
76+
// AFTER-SAME: #cir.const_array<"withargfunc" : !cir.array<!s8i x 11>> :
77+
// AFTER-SAME: !cir.array<!s8i x 11> {section = "llvm.metadata"}
78+
// AFTER: cir.global "private" constant cir_private dsolocal @".args.1.llvm.metadata" =
79+
// AFTER-SAME: #cir.const_struct<{#cir.global_view<@".str1"> :
80+
// AFTER-SAME: !cir.ptr<!cir.array<!s8i x 3>>, #cir.int<23> : !s32i}> :
81+
// AFTER-SAME: ![[ANNO_STRUCT_T1]] {section = "llvm.metadata"}
82+
// AFTER: cir.global "private" constant cir_private dsolocal @".args.2.llvm.metadata" =
83+
// AFTER-SAME: #cir.const_struct<{#cir.global_view<@".str1"> :
84+
// AFTER-SAME: !cir.ptr<!cir.array<!s8i x 3>>, #cir.int<22> : !s32i}> :
85+
// AFTER-SAME: ![[ANNO_STRUCT_T1]] {section = "llvm.metadata"}
86+
87+
// AFTER: cir.global appending @llvm.global.annotations =
88+
// AFTER-SAME: #cir.const_array<
89+
90+
// AFTER-SAME: [#cir.const_struct<{#cir.global_view<@a> : !cir.ptr<!void>,
91+
// AFTER-SAME: #cir.global_view<@".str.0.llvm.metadata"> : !cir.ptr<!void>,
92+
// AFTER-SAME: #cir.global_view<@".str.1.llvm.metadata"> : !cir.ptr<!void>,
93+
// AFTER-SAME: #cir.int<5> : !u32i,
94+
// AFTER-SAME: #cir.global_view<@".args.0.llvm.metadata"> : !cir.ptr<!void>}> :
95+
// AFTER-SAME: ![[ANNO_STRUCT_T0]],
96+
97+
// AFTER-SAME: #cir.const_struct<{#cir.global_view<@b> : !cir.ptr<!void>,
98+
// AFTER-SAME: #cir.global_view<@".str.0.llvm.metadata"> : !cir.ptr<!void>,
99+
// AFTER-SAME: #cir.global_view<@".str.1.llvm.metadata"> : !cir.ptr<!void>,
100+
// AFTER-SAME: #cir.int<6> : !u32i,
101+
// AFTER-SAME: #cir.global_view<@".args.0.llvm.metadata"> : !cir.ptr<!void>}> :
102+
// AFTER-SAME: ![[ANNO_STRUCT_T0]],
103+
104+
// AFTER-SAME: #cir.const_struct<{#cir.global_view<@c> : !cir.ptr<!void>,
105+
// AFTER-SAME: #cir.global_view<@".str.2.llvm.metadata"> : !cir.ptr<!void>,
106+
// AFTER-SAME: #cir.global_view<@".str.1.llvm.metadata"> : !cir.ptr<!void>,
107+
// AFTER-SAME: #cir.int<7> : !u32i,
108+
// AFTER-SAME: #cir.zero : !cir.ptr<!void>}> :
109+
// AFTER-SAME: ![[ANNO_STRUCT_T0]],
110+
111+
// AFTER-SAME: #cir.const_struct<{#cir.global_view<@_Z3fooi> : !cir.ptr<!void>,
112+
// AFTER-SAME: #cir.global_view<@".str.3.llvm.metadata"> : !cir.ptr<!void>,
113+
// AFTER-SAME: #cir.global_view<@".str.1.llvm.metadata"> : !cir.ptr<!void>,
114+
// AFTER-SAME: #cir.int<11> : !u32i,
115+
// AFTER-SAME: #cir.zero : !cir.ptr<!void>}> :
116+
// AFTER-SAME: ![[ANNO_STRUCT_T0]],
117+
118+
// AFTER-SAME: #cir.const_struct<{#cir.global_view<@_Z3fooi> : !cir.ptr<!void>,
119+
// AFTER-SAME: #cir.global_view<@".str.4.llvm.metadata"> : !cir.ptr<!void>,
120+
// AFTER-SAME: #cir.global_view<@".str.1.llvm.metadata"> : !cir.ptr<!void>,
121+
// AFTER-SAME: #cir.int<11> : !u32i,
122+
// AFTER-SAME: #cir.global_view<@".args.1.llvm.metadata"> : !cir.ptr<!void>}> :
123+
// AFTER-SAME: ![[ANNO_STRUCT_T0]],
124+
125+
// AFTER-SAME: #cir.const_struct<{#cir.global_view<@_Z3barv> : !cir.ptr<!void>,
126+
// AFTER-SAME: #cir.global_view<@".str.4.llvm.metadata"> : !cir.ptr<!void>,
127+
// AFTER-SAME: #cir.global_view<@".str.1.llvm.metadata"> : !cir.ptr<!void>,
128+
// AFTER-SAME: #cir.int<12> : !u32i,
129+
// AFTER-SAME: #cir.global_view<@".args.2.llvm.metadata"> : !cir.ptr<!void>}> :
130+
// AFTER-SAME: ![[ANNO_STRUCT_T0]]]> :
131+
// AFTER-SAME: !cir.array<![[ANNO_STRUCT_T0]] x 6> {section = "llvm.metadata"}
132+
133+
// LLVM: @.str.0.llvm.metadata = private constant [8 x i8] c"withargs", section "llvm.metadata"
134+
// LLVM: @.str.1.llvm.metadata = private constant [[[FILENAME_LEN:[0-9]+]] x i8] c"[[PATH:.*]]attribute-annotate-multiple.cpp", section "llvm.metadata"
135+
// LLVM: @.args.0.llvm.metadata = private constant { ptr, i32 } { ptr @.str, i32 12 }, section "llvm.metadata"
136+
// LLVM: @.str.2.llvm.metadata = private constant [8 x i8] c"noargvar", section "llvm.metadata"
137+
// LLVM: @.str.3.llvm.metadata = private constant [9 x i8] c"noargfunc", section "llvm.metadata"
138+
// LLVM: @.str.4.llvm.metadata = private constant [11 x i8] c"withargfunc", section "llvm.metadata"
139+
// LLVM: @.args.1.llvm.metadata = private constant { ptr, i32 } { ptr @.str1, i32 23 }, section "llvm.metadata"
140+
// LLVM: @.args.2.llvm.metadata = private constant { ptr, i32 } { ptr @.str1, i32 22 }, section "llvm.metadata"
141+
142+
// LLVM: @llvm.global.annotations = appending global [6 x { ptr, ptr, ptr, i32, ptr }]
143+
// LLVM-SAME: [{ ptr, ptr, ptr, i32, ptr }
144+
// LLVM-SAME: { ptr @a, ptr @.str.0.llvm.metadata, ptr @.str.1.llvm.metadata, i32 5, ptr @.args.0.llvm.metadata },
145+
146+
// LLVM-SAME: { ptr, ptr, ptr, i32, ptr }
147+
// LLVM-SAME: { ptr @b, ptr @.str.0.llvm.metadata, ptr @.str.1.llvm.metadata, i32 6, ptr @.args.0.llvm.metadata },
148+
149+
// LLVM-SAME: { ptr, ptr, ptr, i32, ptr }
150+
// LLVM-SAME: { ptr @c, ptr @.str.2.llvm.metadata, ptr @.str.1.llvm.metadata, i32 7, ptr null },
151+
152+
// LLVM-SAME: { ptr, ptr, ptr, i32, ptr }
153+
// LLVM-SAME: { ptr @_Z3fooi, ptr @.str.3.llvm.metadata, ptr @.str.1.llvm.metadata, i32 11, ptr null },
154+
155+
// LLVM-SAME: { ptr, ptr, ptr, i32, ptr }
156+
// LLVM-SAME: { ptr @_Z3fooi, ptr @.str.4.llvm.metadata, ptr @.str.1.llvm.metadata, i32 11, ptr @.args.1.llvm.metadata },
157+
158+
// LLVM-SAME: { ptr, ptr, ptr, i32, ptr }
159+
// LLVM-SAME: { ptr @_Z3barv, ptr @.str.4.llvm.metadata, ptr @.str.1.llvm.metadata, i32 12, ptr @.args.2.llvm.metadata }],
160+
// LLVM-SAME: section "llvm.metadata"
161+
162+
// LLVM: @a = global ptr null
163+
// LLVM: @.str = internal constant [3 x i8] c"21\00"
164+
// LLVM: @b = global ptr null
165+
// LLVM: @c = global ptr null
166+
// LLVM: @.str1 = internal constant [3 x i8] c"os\00"
167+
168+
// LLVM: define dso_local void @_Z3fooi(i32 %0)
169+
// LLVM: define dso_local void @_Z3barv()

0 commit comments

Comments
 (0)