Author: aaronballman Date: Mon May 20 09:46:44 2019 New Revision: 361172 URL: http://llvm.org/viewvc/llvm-project?rev=361172&view=rev Log: Dump macro expansion information as needed when outputting the AST to JSON.
Added: cfe/trunk/test/AST/ast-dump-macro-json.c Modified: cfe/trunk/include/clang/AST/JSONNodeDumper.h cfe/trunk/lib/AST/JSONNodeDumper.cpp Modified: cfe/trunk/include/clang/AST/JSONNodeDumper.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/JSONNodeDumper.h?rev=361172&r1=361171&r2=361172&view=diff ============================================================================== --- cfe/trunk/include/clang/AST/JSONNodeDumper.h (original) +++ cfe/trunk/include/clang/AST/JSONNodeDumper.h Mon May 20 09:46:44 2019 @@ -132,6 +132,12 @@ class JSONNodeDumper JOS.attribute(Key, Value); } + // Creates a single SourceLocation JSON representation of the given location. + llvm::json::Object createBareSourceLocation(SourceLocation Loc); + // Creates a JSON representation of a SourceLocation based on its presumed + // spelling location. If the given location represents a macro invocation, + // this outputs two sub-objects: one for the spelling and one for the + // expansion location. llvm::json::Object createSourceLocation(SourceLocation Loc); llvm::json::Object createSourceRange(SourceRange R); std::string createPointerRepresentation(const void *Ptr); Modified: cfe/trunk/lib/AST/JSONNodeDumper.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/JSONNodeDumper.cpp?rev=361172&r1=361171&r2=361172&view=diff ============================================================================== --- cfe/trunk/lib/AST/JSONNodeDumper.cpp (original) +++ cfe/trunk/lib/AST/JSONNodeDumper.cpp Mon May 20 09:46:44 2019 @@ -146,9 +146,9 @@ void JSONNodeDumper::Visit(const Generic attributeOnlyIfTrue("selected", A.isSelected()); } -llvm::json::Object JSONNodeDumper::createSourceLocation(SourceLocation Loc) { - SourceLocation Spelling = SM.getSpellingLoc(Loc); - PresumedLoc Presumed = SM.getPresumedLoc(Spelling); +llvm::json::Object +JSONNodeDumper::createBareSourceLocation(SourceLocation Loc) { + PresumedLoc Presumed = SM.getPresumedLoc(Loc); if (Presumed.isInvalid()) return llvm::json::Object{}; @@ -158,6 +158,28 @@ llvm::json::Object JSONNodeDumper::creat {"col", Presumed.getColumn()}}; } +llvm::json::Object JSONNodeDumper::createSourceLocation(SourceLocation Loc) { + SourceLocation Spelling = SM.getSpellingLoc(Loc); + SourceLocation Expansion = SM.getExpansionLoc(Loc); + + llvm::json::Object SLoc = createBareSourceLocation(Spelling); + if (Expansion != Spelling) { + // If the expansion and the spelling are different, output subobjects + // describing both locations. + llvm::json::Object ELoc = createBareSourceLocation(Expansion); + + // If there is a macro expansion, add extra information if the interesting + // bit is the macro arg expansion. + if (SM.isMacroArgExpansion(Loc)) + ELoc["isMacroArgExpansion"] = true; + + return llvm::json::Object{{"spellingLoc", std::move(SLoc)}, + {"expansionLoc", std::move(ELoc)}}; + } + + return SLoc; +} + llvm::json::Object JSONNodeDumper::createSourceRange(SourceRange R) { return llvm::json::Object{{"begin", createSourceLocation(R.getBegin())}, {"end", createSourceLocation(R.getEnd())}}; Added: cfe/trunk/test/AST/ast-dump-macro-json.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/AST/ast-dump-macro-json.c?rev=361172&view=auto ============================================================================== --- cfe/trunk/test/AST/ast-dump-macro-json.c (added) +++ cfe/trunk/test/AST/ast-dump-macro-json.c Mon May 20 09:46:44 2019 @@ -0,0 +1,179 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -ast-dump=json %s | FileCheck %s + +#define FOO frobble +#define BAR FOO + +void FOO(void); +void BAR(void); + +#define BING(x) x + +void BING(quux)(void); + +#define BLIP(x, y) x ## y +#define BLAP(x, y) BLIP(x, y) + +void BLAP(foo, __COUNTER__)(void); +void BLAP(foo, __COUNTER__)(void); + + +// CHECK: "kind": "FunctionDecl", +// CHECK-NEXT: "loc": { +// CHECK-NEXT: "expansionLoc": { +// CHECK-NEXT: "col": 6, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "line": 6 +// CHECK-NEXT: }, +// CHECK-NEXT: "spellingLoc": { +// CHECK-NEXT: "col": 13, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "line": 3 +// CHECK-NEXT: } +// CHECK-NEXT: }, +// CHECK-NEXT: "range": { +// CHECK-NEXT: "begin": { +// CHECK-NEXT: "col": 1, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "line": 6 +// CHECK-NEXT: }, +// CHECK-NEXT: "end": { +// CHECK-NEXT: "col": 14, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "line": 6 +// CHECK-NEXT: } +// CHECK-NEXT: }, +// CHECK-NEXT: "name": "frobble", +// CHECK-NEXT: "type": { +// CHECK-NEXT: "qualType": "void (void)" +// CHECK-NEXT: } +// CHECK-NEXT: } + + +// CHECK: "kind": "FunctionDecl", +// CHECK-NEXT: "loc": { +// CHECK-NEXT: "expansionLoc": { +// CHECK-NEXT: "col": 6, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "line": 7 +// CHECK-NEXT: }, +// CHECK-NEXT: "spellingLoc": { +// CHECK-NEXT: "col": 13, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "line": 3 +// CHECK-NEXT: } +// CHECK-NEXT: }, +// CHECK-NEXT: "range": { +// CHECK-NEXT: "begin": { +// CHECK-NEXT: "col": 1, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "line": 7 +// CHECK-NEXT: }, +// CHECK-NEXT: "end": { +// CHECK-NEXT: "col": 14, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "line": 7 +// CHECK-NEXT: } +// CHECK-NEXT: }, +// CHECK-NEXT: "previousDecl": "0x{{.*}}", +// CHECK-NEXT: "name": "frobble", +// CHECK-NEXT: "type": { +// CHECK-NEXT: "qualType": "void (void)" +// CHECK-NEXT: } +// CHECK-NEXT: } + + +// CHECK: "kind": "FunctionDecl", +// CHECK-NEXT: "loc": { +// CHECK-NEXT: "expansionLoc": { +// CHECK-NEXT: "col": 6, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "isMacroArgExpansion": true, +// CHECK-NEXT: "line": 11 +// CHECK-NEXT: }, +// CHECK-NEXT: "spellingLoc": { +// CHECK-NEXT: "col": 11, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "line": 11 +// CHECK-NEXT: } +// CHECK-NEXT: }, +// CHECK-NEXT: "range": { +// CHECK-NEXT: "begin": { +// CHECK-NEXT: "col": 1, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "line": 11 +// CHECK-NEXT: }, +// CHECK-NEXT: "end": { +// CHECK-NEXT: "col": 21, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "line": 11 +// CHECK-NEXT: } +// CHECK-NEXT: }, +// CHECK-NEXT: "name": "quux", +// CHECK-NEXT: "type": { +// CHECK-NEXT: "qualType": "void (void)" +// CHECK-NEXT: } +// CHECK-NEXT: } + + +// CHECK: "kind": "FunctionDecl", +// CHECK-NEXT: "loc": { +// CHECK-NEXT: "expansionLoc": { +// CHECK-NEXT: "col": 6, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "line": 16 +// CHECK-NEXT: }, +// CHECK-NEXT: "spellingLoc": { +// CHECK-NEXT: "col": 1, +// CHECK-NEXT: "file": "<scratch space>", +// CHECK-NEXT: "line": 3 +// CHECK-NEXT: } +// CHECK-NEXT: }, +// CHECK-NEXT: "range": { +// CHECK-NEXT: "begin": { +// CHECK-NEXT: "col": 1, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "line": 16 +// CHECK-NEXT: }, +// CHECK-NEXT: "end": { +// CHECK-NEXT: "col": 33, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "line": 16 +// CHECK-NEXT: } +// CHECK-NEXT: }, +// CHECK-NEXT: "name": "foo0", +// CHECK-NEXT: "type": { +// CHECK-NEXT: "qualType": "void (void)" +// CHECK-NEXT: } +// CHECK-NEXT: } + + +// CHECK: "kind": "FunctionDecl", +// CHECK-NEXT: "loc": { +// CHECK-NEXT: "expansionLoc": { +// CHECK-NEXT: "col": 6, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "line": 17 +// CHECK-NEXT: }, +// CHECK-NEXT: "spellingLoc": { +// CHECK-NEXT: "col": 1, +// CHECK-NEXT: "file": "<scratch space>", +// CHECK-NEXT: "line": 5 +// CHECK-NEXT: } +// CHECK-NEXT: }, +// CHECK-NEXT: "range": { +// CHECK-NEXT: "begin": { +// CHECK-NEXT: "col": 1, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "line": 17 +// CHECK-NEXT: }, +// CHECK-NEXT: "end": { +// CHECK-NEXT: "col": 33, +// CHECK-NEXT: "file": "{{.*}}", +// CHECK-NEXT: "line": 17 +// CHECK-NEXT: } +// CHECK-NEXT: }, +// CHECK-NEXT: "name": "foo1", +// CHECK-NEXT: "type": { +// CHECK-NEXT: "qualType": "void (void)" +// CHECK-NEXT: } +// CHECK-NEXT: } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits