llvm-project/clang/test/AST
Johannes Doerfert befb4be3a8 [OpenMP] `omp begin/end declare variant` - part 2, sema ("+CG")
This is the second part loosely extracted from D71179 and cleaned up.

This patch provides semantic analysis support for `omp begin/end declare
variant`, mostly as defined in OpenMP technical report 8 (TR8) [0].
The sema handling makes code generation obsolete as we generate "the
right" calls that can just be handled as usual. This handling also
applies to the existing, albeit problematic, `omp declare variant
support`. As a consequence a lot of unneeded code generation and
complexity is removed.

A major purpose of this patch is to provide proper `math.h`/`cmath`
support for OpenMP target offloading. See PR42061, PR42798, PR42799. The
current code was developed with this feature in mind, see [1].

The logic is as follows:

If we have seen a `#pragma omp begin declare variant match(<SELECTOR>)`
but not the corresponding `end declare variant`, and we find a function
definition we will:
  1) Create a function declaration for the definition we were about to generate.
  2) Create a function definition but with a mangled name (according to
     `<SELECTOR>`).
  3) Annotate the declaration with the `OMPDeclareVariantAttr`, the same
     one used already for `omp declare variant`, using and the mangled
     function definition as specialization for the context defined by
     `<SELECTOR>`.

When a call is created we inspect it. If the target has an
`OMPDeclareVariantAttr` attribute we try to specialize the call. To this
end, all variants are checked, the best applicable one is picked and a
new call to the specialization is created. The new call is used instead
of the original one to the base function. To keep the AST printing and
tooling possible we utilize the PseudoObjectExpr. The original call is
the syntactic expression, the specialized call is the semantic
expression.

[0] https://www.openmp.org/wp-content/uploads/openmp-TR8.pdf
[1] https://reviews.llvm.org/D61399#change-496lQkg0mhRN

Reviewers: kiranchandramohan, ABataev, RaviNarayanaswamy, gtbercea, grokos, sdmitriev, JonChesterfield, hfinkel, fghanim, aaron.ballman

Subscribers: bollu, guansong, openmp-commits, cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D75779
2020-03-27 02:30:58 -05:00
..
Inputs Add more information to JSON AST dumping of source locations. 2019-10-15 17:30:19 +00:00
Interp [ConstExprPreter] Removed the flag forcing the use of the interpreter 2019-11-27 20:07:19 +00:00
address_space_attribute.cpp [Sema] Fix Modified Type in address_space AttributedType 2019-01-24 00:11:35 +00:00
ast-dump-aarch64-sve-types.c Add SVE opaque built-in types 2019-08-09 08:52:54 +00:00
ast-dump-arm-attr.c [ARM][CMSE] Implement CMSE attributes 2020-03-24 10:21:26 +00:00
ast-dump-array.cpp Extend test for DependentSizedArrayType 2018-12-04 09:53:36 +00:00
ast-dump-attr.cpp Add lifetime categories attributes 2019-07-25 17:50:51 +00:00
ast-dump-attr.m
ast-dump-c-attr.c
ast-dump-color.cpp Revert r372325 - Reverting r372323 because it broke color tests on Linux. 2019-09-19 15:10:51 +00:00
ast-dump-comment-json.cpp Add more information to JSON AST dumping of source locations. 2019-10-15 17:30:19 +00:00
ast-dump-comment.cpp [Wdocumentation] Implement \anchor 2019-12-21 14:52:21 +01:00
ast-dump-decl-context-json.cpp Include the mangled name in -ast-dump=json 2019-11-15 12:52:56 +00:00
ast-dump-decl-json.c Include the mangled name in -ast-dump=json 2019-11-15 12:52:56 +00:00
ast-dump-decl-json.m Add a missing triple in ast-dump-decl-json.m 2019-11-15 20:15:00 +00:00
ast-dump-decl-stmts.cpp
ast-dump-decl.c Added test cases for dumping variadic-like functions; NFC. 2019-01-16 16:12:30 +00:00
ast-dump-decl.cpp [clang] Make handling of unnamed template params similar to function params 2019-10-01 14:08:51 +00:00
ast-dump-decl.m [ASTDump] Mark variadic declarations with a tag instead of child node 2019-01-18 21:38:30 +00:00
ast-dump-decl.mm [ASTDump] Mark BlockDecls which capture this with a tag 2019-01-18 21:55:24 +00:00
ast-dump-enum-json.cpp Add more information to JSON AST dumping of source locations. 2019-10-15 17:30:19 +00:00
ast-dump-expr-errors.cpp [AST] Add RecoveryExpr to retain expressions on semantic errors 2020-03-24 09:20:37 +01:00
ast-dump-expr-json.c Include the mangled name in -ast-dump=json 2019-11-15 12:52:56 +00:00
ast-dump-expr-json.cpp Refactor CompareReferenceRelationship and its callers in preparation for 2019-12-18 14:05:57 -08:00
ast-dump-expr-json.m Include the mangled name in -ast-dump=json 2019-11-15 12:52:56 +00:00
ast-dump-expr.c Add an explicit triple to this test to fix failing test bots. 2018-12-10 19:18:11 +00:00
ast-dump-expr.cpp Factor out commonality between variable capture initialization and 2019-06-02 04:00:43 +00:00
ast-dump-file-line-json.c Correcting the offsets within the test to fix the bots. 2019-12-03 13:21:35 -05:00
ast-dump-funcs-json.cpp Include the mangled name in -ast-dump=json 2019-11-15 12:52:56 +00:00
ast-dump-funcs.cpp Added test cases for dumping variadic-like functions; NFC. 2019-01-16 16:12:30 +00:00
ast-dump-hip-pinned-shadow.cu [HIP] Support attribute hip_pinned_shadow 2019-06-26 03:47:37 +00:00
ast-dump-if-json.cpp Include the mangled name in -ast-dump=json 2019-11-15 12:52:56 +00:00
ast-dump-invalid.cpp
ast-dump-lookups.cpp
ast-dump-macro-json.c Include the mangled name in -ast-dump=json 2019-11-15 12:52:56 +00:00
ast-dump-msp430-attr.c
ast-dump-namespace-json.cpp Add more information to JSON AST dumping of source locations. 2019-10-15 17:30:19 +00:00
ast-dump-objc-arc-json.m [CodeGen] Emit destructor calls to destruct compound literals 2020-03-10 14:08:28 -07:00
ast-dump-openmp-atomic.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-barrier.c [OpenMP] Set pragma start loc to `#pragma` loc 2019-05-28 19:27:19 +00:00
ast-dump-openmp-begin-declare-variant_1.c [OpenMP] `omp begin/end declare variant` - part 2, sema ("+CG") 2020-03-27 02:30:58 -05:00
ast-dump-openmp-begin-declare-variant_2.c [OpenMP] `omp begin/end declare variant` - part 2, sema ("+CG") 2020-03-27 02:30:58 -05:00
ast-dump-openmp-begin-declare-variant_3.c [OpenMP] `omp begin/end declare variant` - part 2, sema ("+CG") 2020-03-27 02:30:58 -05:00
ast-dump-openmp-begin-declare-variant_4.c [OpenMP] `omp begin/end declare variant` - part 2, sema ("+CG") 2020-03-27 02:30:58 -05:00
ast-dump-openmp-begin-declare-variant_5.c [OpenMP] `omp begin/end declare variant` - part 2, sema ("+CG") 2020-03-27 02:30:58 -05:00
ast-dump-openmp-begin-declare-variant_6.c [OpenMP] `omp begin/end declare variant` - part 2, sema ("+CG") 2020-03-27 02:30:58 -05:00
ast-dump-openmp-begin-declare-variant_7.c [OpenMP] `omp begin/end declare variant` - part 2, sema ("+CG") 2020-03-27 02:30:58 -05:00
ast-dump-openmp-begin-declare-variant_8.c [OpenMP] `omp begin/end declare variant` - part 2, sema ("+CG") 2020-03-27 02:30:58 -05:00
ast-dump-openmp-begin-declare-variant_9.c [OpenMP] `omp begin/end declare variant` - part 2, sema ("+CG") 2020-03-27 02:30:58 -05:00
ast-dump-openmp-begin-declare-variant_addr_1.c [OpenMP] `omp begin/end declare variant` - part 2, sema ("+CG") 2020-03-27 02:30:58 -05:00
ast-dump-openmp-begin-declare-variant_decl_1.c [OpenMP] `omp begin/end declare variant` - part 2, sema ("+CG") 2020-03-27 02:30:58 -05:00
ast-dump-openmp-cancel.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-cancellation-point.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-critical.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-distribute-parallel-for-simd.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-distribute-parallel-for.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-distribute-simd.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-distribute.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-flush.c [OpenMP] Set pragma start loc to `#pragma` loc 2019-05-28 19:27:19 +00:00
ast-dump-openmp-for-simd.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-for.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-master.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-ordered.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-parallel-for-simd.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-parallel-for.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-parallel-master-XFAIL.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-parallel-sections.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-parallel.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-section.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-sections.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-simd.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-single.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-target-data.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-target-enter-data.c [OpenMP] Set pragma start loc to `#pragma` loc 2019-05-28 19:27:19 +00:00
ast-dump-openmp-target-exit-data.c [OpenMP] Set pragma start loc to `#pragma` loc 2019-05-28 19:27:19 +00:00
ast-dump-openmp-target-parallel-for-simd.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-target-parallel-for.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-target-parallel.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-target-simd.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-target-teams-distribute-parallel-for-simd.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-target-teams-distribute-parallel-for.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-target-teams-distribute-simd.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-target-teams-distribute.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-target-teams.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-target-update.c [OpenMP] Set pragma start loc to `#pragma` loc 2019-05-28 19:27:19 +00:00
ast-dump-openmp-target.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-task.c [OPENMP50]Mark expression in detach clause as firstprivate. 2020-03-17 14:05:13 -04:00
ast-dump-openmp-taskgroup.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-taskloop-simd.c [OPENMP]Fix PR45047: Do not copy firstprivates in tasks twice. 2020-03-13 18:04:16 -04:00
ast-dump-openmp-taskloop.c [OPENMP]Fix PR45047: Do not copy firstprivates in tasks twice. 2020-03-13 18:04:16 -04:00
ast-dump-openmp-taskwait.c [OpenMP] Set pragma start loc to `#pragma` loc 2019-05-28 19:27:19 +00:00
ast-dump-openmp-taskyield.c [OpenMP] Set pragma start loc to `#pragma` loc 2019-05-28 19:27:19 +00:00
ast-dump-openmp-teams-distribute-parallel-for-simd.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-teams-distribute-parallel-for.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-teams-distribute-simd.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-teams-distribute.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-openmp-teams.c [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
ast-dump-pipe.cl
ast-dump-record-definition-data-json.cpp [Concepts] Placeholder constraints and abbreviated templates 2020-01-23 19:39:43 +02:00
ast-dump-record-definition-data.cpp Adding tests for -ast-dump; NFC. 2018-12-04 21:50:08 +00:00
ast-dump-records-json.cpp Include the mangled name in -ast-dump=json 2019-11-15 12:52:56 +00:00
ast-dump-records.c
ast-dump-records.cpp [ASTDump] Add is_anonymous to VisitCXXRecordDecl 2019-08-12 17:07:49 +00:00
ast-dump-recovery.cpp [AST] Build recovery expressions for nonexistent member exprs. 2020-03-26 08:50:33 +01:00
ast-dump-special-member-functions.cpp Adding tests for -ast-dump; NFC. 2018-12-04 21:50:08 +00:00
ast-dump-stmt-json.c Include the mangled name in -ast-dump=json 2019-11-15 12:52:56 +00:00
ast-dump-stmt-json.cpp [clang] Annotating C++'s `operator new` with more attributes 2020-02-26 01:37:17 +03:00
ast-dump-stmt-json.m Include the mangled name in -ast-dump=json 2019-11-15 12:52:56 +00:00
ast-dump-stmt.c Ignore trailing NullStmts in StmtExprs for GCC compatibility. 2019-07-09 15:02:07 +00:00
ast-dump-stmt.cpp [ASTDump] Add utility for dumping a label with child nodes 2019-01-11 19:11:17 +00:00
ast-dump-stmt.m [CodeGen] Emit destructor calls to destruct compound literals 2020-03-10 14:08:28 -07:00
ast-dump-template-decls-json.cpp Include the mangled name in -ast-dump=json 2019-11-15 12:52:56 +00:00
ast-dump-template-decls.cpp [clang] Make handling of unnamed template params similar to function params 2019-10-01 14:08:51 +00:00
ast-dump-templates.cpp
ast-dump-temporaries-json.cpp Add more information to JSON AST dumping of source locations. 2019-10-15 17:30:19 +00:00
ast-dump-types-json.cpp Add more information to JSON AST dumping of source locations. 2019-10-15 17:30:19 +00:00
ast-dump-undeserialized.cpp Move decl context dumping to TextNodeDumper 2019-01-19 09:05:55 +00:00
ast-dump-wchar.cpp [Sema] Make string literal init an rvalue. 2019-02-08 21:18:46 +00:00
ast-print-attr.c Disallow an empty string literal in an asm label 2020-01-08 08:38:02 -05:00
ast-print-bool.c
ast-print-char-literal.cpp
ast-print-enum-decl.c
ast-print-no-sanitize.cpp Do not use the incorrect attribute spelling list index when translating a no_sanitize_foo attribute into a no_sanitize("foo") attribute. 2019-05-21 17:24:49 +00:00
ast-print-objc-property.m Clean up ObjCPropertyDecl printing 2019-04-08 19:52:45 +00:00
ast-print-objectivec.m
ast-print-out-of-line-func.cpp
ast-print-pragmas.cpp [Clang] New loop pragma vectorize_predicate 2019-07-25 07:33:13 +00:00
ast-print-record-decl.c
ast-printer-lambda.cpp [clang] fixing -ast-print for variadic parameter pack in lambda capture 2019-05-05 12:35:12 +00:00
atomic-expr.cpp [Sema] Fix the atomic expr rebuilding order. 2019-09-23 18:48:06 +00:00
attr-print-emit.cpp
attr-target-ast.c
auto-pragma.cpp
bool-type.m
builtins-arm-strex-rettype.c
c-casts.c
category-attribute.m
coroutine-source-location-crash.cpp [clang] Do not read from 'test/SemaCXX/Inputs' inside 'test/AST' 2018-12-03 11:26:35 +00:00
dump.cpp [clang] Prune 'IsOMPStructuredBlock' Stmt bit 2020-03-12 14:48:57 +03:00
finally-msvc.m
fixed_point.c
fixed_point_to_string.c
float16.cpp [ASTDump] Add a flag indicating whether a CXXThisExpr is implicit 2019-02-03 18:20:27 +00:00
foreachtemplatized.mm
function-alias.cpp Look through typedefs in getFunctionTypeWithExceptionSpec 2019-02-13 09:39:17 +00:00
gen_ast_dump_json_test.py Switch to opening the temp file in binary mode 2019-12-03 15:31:46 -05:00
implicit-cast-dump.c
language_address_space_attribute.cpp [OpenCL] Pretty print __private addr space 2019-12-27 13:42:07 +00:00
multistep-explicit-cast-json.c Add more information to JSON AST dumping of source locations. 2019-10-15 17:30:19 +00:00
multistep-explicit-cast-json.cpp Add more information to JSON AST dumping of source locations. 2019-10-15 17:30:19 +00:00
multistep-explicit-cast.c
multistep-explicit-cast.cpp
objc-default-ctor-init.mm
pr43983.cpp Apply the alignment specifier attribute to anonymous unions and structs. 2019-12-20 14:42:37 -05:00
pragma-attribute-cxx-subject-match-rules.cpp
pragma-attribute-objc-subject-match-rules.m
property-atomic-bool.m
rdr6094103-unordered-compare-promote.c
sourceranges.cpp Include leading attributes in DeclStmt's SourceRange 2019-10-17 11:20:21 +00:00
template-implicit-vars.cpp
variadic-promotion.c