Author: serge-sans-paille Date: 2023-08-28T06:34:57+02:00 New Revision: 4198576157bfd0d08c08b784220d6132b709ae2c
URL: https://github.com/llvm/llvm-project/commit/4198576157bfd0d08c08b784220d6132b709ae2c DIFF: https://github.com/llvm/llvm-project/commit/4198576157bfd0d08c08b784220d6132b709ae2c.diff LOG: [clang] - Add missing builtin name to AtomicExpr JSON dump As a side effect, introduce AtomicExpr::getOpAsString() to dump the AtomicOp string representation. This is a recommit with the ranges unchecked to cope with platform-specific values. Differential Revision: https://reviews.llvm.org/D158558 Added: clang/test/AST/ast-dump-atomic-json.c Modified: clang/include/clang/AST/Expr.h clang/include/clang/AST/JSONNodeDumper.h clang/lib/AST/JSONNodeDumper.cpp Removed: ################################################################################ diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h index 6737721e1ed1b2..8d1235be78a4ad 100644 --- a/clang/include/clang/AST/Expr.h +++ b/clang/include/clang/AST/Expr.h @@ -6480,6 +6480,15 @@ class AtomicExpr : public Expr { QualType getValueType() const; AtomicOp getOp() const { return Op; } + StringRef getOpAsString() const { + switch (Op) { +#define BUILTIN(ID, TYPE, ATTRS) +#define ATOMIC_BUILTIN(ID, TYPE, ATTRS) \ + case AO##ID: \ + return #ID; +#include "clang/Basic/Builtins.def" + } + } unsigned getNumSubExprs() const { return NumSubExprs; } Expr **getSubExprs() { return reinterpret_cast<Expr **>(SubExprs); } diff --git a/clang/include/clang/AST/JSONNodeDumper.h b/clang/include/clang/AST/JSONNodeDumper.h index 0ce272df8df65b..4def5389137fa4 100644 --- a/clang/include/clang/AST/JSONNodeDumper.h +++ b/clang/include/clang/AST/JSONNodeDumper.h @@ -285,6 +285,7 @@ class JSONNodeDumper void VisitBinaryOperator(const BinaryOperator *BO); void VisitCompoundAssignOperator(const CompoundAssignOperator *CAO); void VisitMemberExpr(const MemberExpr *ME); + void VisitAtomicExpr(const AtomicExpr *AE); void VisitCXXNewExpr(const CXXNewExpr *NE); void VisitCXXDeleteExpr(const CXXDeleteExpr *DE); void VisitCXXThisExpr(const CXXThisExpr *TE); diff --git a/clang/lib/AST/JSONNodeDumper.cpp b/clang/lib/AST/JSONNodeDumper.cpp index 139dfce41e914c..e67c2c7e216dce 100644 --- a/clang/lib/AST/JSONNodeDumper.cpp +++ b/clang/lib/AST/JSONNodeDumper.cpp @@ -1179,6 +1179,10 @@ void JSONNodeDumper::VisitBlockDecl(const BlockDecl *D) { attributeOnlyIfTrue("capturesThis", D->capturesCXXThis()); } +void JSONNodeDumper::VisitAtomicExpr(const AtomicExpr *AE) { + JOS.attribute("name", AE->getOpAsString()); +} + void JSONNodeDumper::VisitObjCEncodeExpr(const ObjCEncodeExpr *OEE) { JOS.attribute("encodedType", createQualType(OEE->getEncodedType())); } diff --git a/clang/test/AST/ast-dump-atomic-json.c b/clang/test/AST/ast-dump-atomic-json.c new file mode 100644 index 00000000000000..fa236cee25a1bd --- /dev/null +++ b/clang/test/AST/ast-dump-atomic-json.c @@ -0,0 +1,60 @@ +// RUN: %clang_cc1 -triple x86_64-pc-linux -Wno-unused-value -ast-dump=json %s | FileCheck %s + +int foo(int * ptr) { + return __atomic_load_n(ptr, __ATOMIC_SEQ_CST); +} + +// NOTE: CHECK lines have *not* been autogenerated by gen_ast_dump_json_test.py +// as its output is not portable for AtomicExpr across platforms. Instead rely +// on loose CHECKS. + + +// CHECK-NOT: {{^}}Dumping +// CHECK: "kind": "AtomicExpr", +// CHECK: "type": { +// CHECK: "qualType": "int" +// CHECK: }, +// CHECK: "valueCategory": "prvalue", +// CHECK: "name": "__atomic_load_n", +// CHECK: "inner": [ +// CHECK: { +// CHECK: "id": "0x{{.*}}", +// CHECK: "kind": "ImplicitCastExpr", +// CHECK: }, +// CHECK: "type": { +// CHECK: "qualType": "int *" +// CHECK: }, +// CHECK: "valueCategory": "prvalue", +// CHECK: "castKind": "LValueToRValue", +// CHECK: "inner": [ +// CHECK: { +// CHECK: "id": "0x{{.*}}", +// CHECK: "kind": "DeclRefExpr", +// CHECK: }, +// CHECK: "type": { +// CHECK: "qualType": "int *" +// CHECK: }, +// CHECK: "valueCategory": "lvalue", +// CHECK: "referencedDecl": { +// CHECK: "id": "0x{{.*}}", +// CHECK: "kind": "ParmVarDecl", +// CHECK: "name": "ptr", +// CHECK: "type": { +// CHECK: "qualType": "int *" +// CHECK: } +// CHECK: } +// CHECK: } +// CHECK: ] +// CHECK: }, +// CHECK: { +// CHECK: "id": "0x{{.*}}", +// CHECK: "kind": "IntegerLiteral", +// CHECK: }, +// CHECK: "type": { +// CHECK: "qualType": "int" +// CHECK: }, +// CHECK: "valueCategory": "prvalue", +// CHECK: "value": "5" +// CHECK: } +// CHECK: ] +// CHECK: } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits