Skip to content

Commit dbccf3c

Browse files
[clang] - Add missing builtin name to AtomicExpr JSON dump
As a side effect, introduce AtomicExpr::getOpAsString() to dump the AtomicOp string representation. Differential Revision: https://reviews.llvm.org/D158558
1 parent 515bd40 commit dbccf3c

File tree

4 files changed

+142
-0
lines changed

4 files changed

+142
-0
lines changed

clang/include/clang/AST/Expr.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6480,6 +6480,15 @@ class AtomicExpr : public Expr {
64806480
QualType getValueType() const;
64816481

64826482
AtomicOp getOp() const { return Op; }
6483+
StringRef getOpAsString() const {
6484+
switch (Op) {
6485+
#define BUILTIN(ID, TYPE, ATTRS)
6486+
#define ATOMIC_BUILTIN(ID, TYPE, ATTRS) \
6487+
case AO##ID: \
6488+
return #ID;
6489+
#include "clang/Basic/Builtins.def"
6490+
}
6491+
}
64836492
unsigned getNumSubExprs() const { return NumSubExprs; }
64846493

64856494
Expr **getSubExprs() { return reinterpret_cast<Expr **>(SubExprs); }

clang/include/clang/AST/JSONNodeDumper.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,7 @@ class JSONNodeDumper
285285
void VisitBinaryOperator(const BinaryOperator *BO);
286286
void VisitCompoundAssignOperator(const CompoundAssignOperator *CAO);
287287
void VisitMemberExpr(const MemberExpr *ME);
288+
void VisitAtomicExpr(const AtomicExpr *AE);
288289
void VisitCXXNewExpr(const CXXNewExpr *NE);
289290
void VisitCXXDeleteExpr(const CXXDeleteExpr *DE);
290291
void VisitCXXThisExpr(const CXXThisExpr *TE);

clang/lib/AST/JSONNodeDumper.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1179,6 +1179,10 @@ void JSONNodeDumper::VisitBlockDecl(const BlockDecl *D) {
11791179
attributeOnlyIfTrue("capturesThis", D->capturesCXXThis());
11801180
}
11811181

1182+
void JSONNodeDumper::VisitAtomicExpr(const AtomicExpr *AE) {
1183+
JOS.attribute("name", AE->getOpAsString());
1184+
}
1185+
11821186
void JSONNodeDumper::VisitObjCEncodeExpr(const ObjCEncodeExpr *OEE) {
11831187
JOS.attribute("encodedType", createQualType(OEE->getEncodedType()));
11841188
}

clang/test/AST/ast-dump-atomic-json.c

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -Wno-unused-value -ast-dump=json %s | FileCheck %s
2+
3+
int foo(int * ptr) {
4+
return __atomic_load_n(ptr, __ATOMIC_SEQ_CST);
5+
}
6+
7+
// NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py
8+
// using --filters=AtomicExpr
9+
10+
11+
// CHECK-NOT: {{^}}Dumping
12+
// CHECK: "kind": "AtomicExpr",
13+
// CHECK-NEXT: "range": {
14+
// CHECK-NEXT: "begin": {
15+
// CHECK-NEXT: "offset": 132,
16+
// CHECK-NEXT: "col": 10,
17+
// CHECK-NEXT: "tokLen": 15
18+
// CHECK-NEXT: },
19+
// CHECK-NEXT: "end": {
20+
// CHECK-NEXT: "offset": 169,
21+
// CHECK-NEXT: "col": 47,
22+
// CHECK-NEXT: "tokLen": 1
23+
// CHECK-NEXT: }
24+
// CHECK-NEXT: },
25+
// CHECK-NEXT: "type": {
26+
// CHECK-NEXT: "qualType": "int"
27+
// CHECK-NEXT: },
28+
// CHECK-NEXT: "valueCategory": "prvalue",
29+
// CHECK-NEXT: "name": "__atomic_load_n",
30+
// CHECK-NEXT: "inner": [
31+
// CHECK-NEXT: {
32+
// CHECK-NEXT: "id": "0x{{.*}}",
33+
// CHECK-NEXT: "kind": "ImplicitCastExpr",
34+
// CHECK-NEXT: "range": {
35+
// CHECK-NEXT: "begin": {
36+
// CHECK-NEXT: "offset": 148,
37+
// CHECK-NEXT: "col": 26,
38+
// CHECK-NEXT: "tokLen": 3
39+
// CHECK-NEXT: },
40+
// CHECK-NEXT: "end": {
41+
// CHECK-NEXT: "offset": 148,
42+
// CHECK-NEXT: "col": 26,
43+
// CHECK-NEXT: "tokLen": 3
44+
// CHECK-NEXT: }
45+
// CHECK-NEXT: },
46+
// CHECK-NEXT: "type": {
47+
// CHECK-NEXT: "qualType": "int *"
48+
// CHECK-NEXT: },
49+
// CHECK-NEXT: "valueCategory": "prvalue",
50+
// CHECK-NEXT: "castKind": "LValueToRValue",
51+
// CHECK-NEXT: "inner": [
52+
// CHECK-NEXT: {
53+
// CHECK-NEXT: "id": "0x{{.*}}",
54+
// CHECK-NEXT: "kind": "DeclRefExpr",
55+
// CHECK-NEXT: "range": {
56+
// CHECK-NEXT: "begin": {
57+
// CHECK-NEXT: "offset": 148,
58+
// CHECK-NEXT: "col": 26,
59+
// CHECK-NEXT: "tokLen": 3
60+
// CHECK-NEXT: },
61+
// CHECK-NEXT: "end": {
62+
// CHECK-NEXT: "offset": 148,
63+
// CHECK-NEXT: "col": 26,
64+
// CHECK-NEXT: "tokLen": 3
65+
// CHECK-NEXT: }
66+
// CHECK-NEXT: },
67+
// CHECK-NEXT: "type": {
68+
// CHECK-NEXT: "qualType": "int *"
69+
// CHECK-NEXT: },
70+
// CHECK-NEXT: "valueCategory": "lvalue",
71+
// CHECK-NEXT: "referencedDecl": {
72+
// CHECK-NEXT: "id": "0x{{.*}}",
73+
// CHECK-NEXT: "kind": "ParmVarDecl",
74+
// CHECK-NEXT: "name": "ptr",
75+
// CHECK-NEXT: "type": {
76+
// CHECK-NEXT: "qualType": "int *"
77+
// CHECK-NEXT: }
78+
// CHECK-NEXT: }
79+
// CHECK-NEXT: }
80+
// CHECK-NEXT: ]
81+
// CHECK-NEXT: },
82+
// CHECK-NEXT: {
83+
// CHECK-NEXT: "id": "0x{{.*}}",
84+
// CHECK-NEXT: "kind": "IntegerLiteral",
85+
// CHECK-NEXT: "range": {
86+
// CHECK-NEXT: "begin": {
87+
// CHECK-NEXT: "spellingLoc": {
88+
// CHECK-NEXT: "offset": 417,
89+
// CHECK-NEXT: "file": "<built-in>",
90+
// CHECK-NEXT: "line": 13,
91+
// CHECK-NEXT: "presumedLine": 12,
92+
// CHECK-NEXT: "col": 26,
93+
// CHECK-NEXT: "tokLen": 1
94+
// CHECK-NEXT: },
95+
// CHECK-NEXT: "expansionLoc": {
96+
// CHECK-NEXT: "offset": 153,
97+
// CHECK-NEXT: "file": "{{.*}}",
98+
// CHECK-NEXT: "line": 4,
99+
// CHECK-NEXT: "col": 31,
100+
// CHECK-NEXT: "tokLen": 16
101+
// CHECK-NEXT: }
102+
// CHECK-NEXT: },
103+
// CHECK-NEXT: "end": {
104+
// CHECK-NEXT: "spellingLoc": {
105+
// CHECK-NEXT: "offset": 417,
106+
// CHECK-NEXT: "file": "<built-in>",
107+
// CHECK-NEXT: "line": 13,
108+
// CHECK-NEXT: "presumedLine": 12,
109+
// CHECK-NEXT: "col": 26,
110+
// CHECK-NEXT: "tokLen": 1
111+
// CHECK-NEXT: },
112+
// CHECK-NEXT: "expansionLoc": {
113+
// CHECK-NEXT: "offset": 153,
114+
// CHECK-NEXT: "file": "{{.*}}",
115+
// CHECK-NEXT: "line": 4,
116+
// CHECK-NEXT: "col": 31,
117+
// CHECK-NEXT: "tokLen": 16
118+
// CHECK-NEXT: }
119+
// CHECK-NEXT: }
120+
// CHECK-NEXT: },
121+
// CHECK-NEXT: "type": {
122+
// CHECK-NEXT: "qualType": "int"
123+
// CHECK-NEXT: },
124+
// CHECK-NEXT: "valueCategory": "prvalue",
125+
// CHECK-NEXT: "value": "5"
126+
// CHECK-NEXT: }
127+
// CHECK-NEXT: ]
128+
// CHECK-NEXT: }

0 commit comments

Comments
 (0)