33  const auto *ATy = dyn_cast<ArrayType>(ArgExpr->
getType());
 
   34  if (!ATy || !ATy->getElementType().isWebAssemblyReferenceType()) {
 
   36                  diag::err_wasm_builtin_arg_must_be_table_type)
 
   39  ElTy = ATy->getElementType();
 
 
   49                  diag::err_wasm_builtin_arg_must_be_integer_type)
 
 
   56  if (
SemaRef.checkArgCount(TheCall, 0))
 
 
   64  if (
SemaRef.checkArgCount(TheCall, 1)) {
 
   71                 diag::err_wasm_builtin_arg_must_be_externref_type)
 
 
   81  if (
SemaRef.checkArgCount(TheCall, 0))
 
   86  QualType Pointee = Context.getFunctionType(Context.VoidTy, {}, {});
 
   89  Type = Context.getAttributedType(attr::WebAssemblyFuncref, 
Type,
 
   90                                   Context.getPointerType(Pointee));
 
 
   99  if (
SemaRef.checkArgCount(TheCall, 2))
 
 
  122  if (
SemaRef.checkArgCount(TheCall, 3))
 
 
  140  if (
SemaRef.checkArgCount(TheCall, 1))
 
 
  154  if (
SemaRef.checkArgCount(TheCall, 3))
 
  164                diag::err_wasm_builtin_arg_must_match_table_element_type)
 
 
  178  if (
SemaRef.checkArgCount(TheCall, 4))
 
  191                diag::err_wasm_builtin_arg_must_match_table_element_type)
 
 
  205  if (
SemaRef.checkArgCount(TheCall, 5))
 
  219                diag::err_wasm_builtin_arg_must_match_table_element_type)
 
  223  for (
int I = 2; I <= 4; I++) {
 
 
  233  if (
SemaRef.checkArgCount(TheCall, 1))
 
  243                diag::err_typecheck_expect_function_pointer)
 
  251                diag::err_typecheck_expect_function_pointer)
 
  255  if (TI.
getABI() == 
"experimental-mv") {
 
  257      return T->isUnionType() || 
T->isStructureType();
 
  263                     err_wasm_builtin_test_fp_sig_cannot_include_struct_or_union)
 
  267    for (
unsigned I = 0; I < NParams; I++) {
 
  272                       err_wasm_builtin_test_fp_sig_cannot_include_struct_or_union)
 
 
  287  case WebAssembly::BI__builtin_wasm_ref_null_extern:
 
  289  case WebAssembly::BI__builtin_wasm_ref_null_func:
 
  291  case WebAssembly::BI__builtin_wasm_ref_is_null_extern:
 
  293  case WebAssembly::BI__builtin_wasm_table_get:
 
  295  case WebAssembly::BI__builtin_wasm_table_set:
 
  297  case WebAssembly::BI__builtin_wasm_table_size:
 
  299  case WebAssembly::BI__builtin_wasm_table_grow:
 
  301  case WebAssembly::BI__builtin_wasm_table_fill:
 
  303  case WebAssembly::BI__builtin_wasm_table_copy:
 
  305  case WebAssembly::BI__builtin_wasm_test_function_pointer_signature:
 
 
  312WebAssemblyImportModuleAttr *
 
  314                                const WebAssemblyImportModuleAttr &AL) {
 
  317  if (
const auto *ExistingAttr = FD->getAttr<WebAssemblyImportModuleAttr>()) {
 
  318    if (ExistingAttr->getImportModule() == AL.getImportModule())
 
  320    Diag(ExistingAttr->getLocation(), diag::warn_mismatched_import)
 
  321        << 0 << ExistingAttr->getImportModule() << AL.getImportModule();
 
  322    Diag(AL.getLoc(), diag::note_previous_attribute);
 
  326    Diag(AL.getLoc(), diag::warn_import_on_definition) << 0;
 
  330      WebAssemblyImportModuleAttr(
getASTContext(), AL, AL.getImportModule());
 
 
  333WebAssemblyImportNameAttr *
 
  337  if (
const auto *ExistingAttr = FD->getAttr<WebAssemblyImportNameAttr>()) {
 
  338    if (ExistingAttr->getImportName() == AL.getImportName())
 
  340    Diag(ExistingAttr->getLocation(), diag::warn_mismatched_import)
 
  341        << 1 << ExistingAttr->getImportName() << AL.getImportName();
 
  342    Diag(AL.getLoc(), diag::note_previous_attribute);
 
  346    Diag(AL.getLoc(), diag::warn_import_on_definition) << 1;
 
  350      WebAssemblyImportNameAttr(
getASTContext(), AL, AL.getImportName());
 
 
  359  if (!
SemaRef.checkStringLiteralArgumentAttr(AL, 0, Str, &ArgLoc))
 
  362    Diag(AL.
getLoc(), diag::warn_import_on_definition) << 0;
 
 
  375  if (!
SemaRef.checkStringLiteralArgumentAttr(AL, 0, Str, &ArgLoc))
 
  378    Diag(AL.
getLoc(), diag::warn_import_on_definition) << 1;
 
 
  395  if (FD->isThisDeclarationADefinition()) {
 
  402  if (!
SemaRef.checkStringLiteralArgumentAttr(AL, 0, Str, &ArgLoc))
 
  405  D->
addAttr(::new (Context) WebAssemblyExportNameAttr(Context, AL, Str));
 
  406  D->
addAttr(UsedAttr::CreateImplicit(Context));
 
 
Defines the clang::ASTContext interface.
Provides definitions for the various language-specific address spaces.
This file declares semantic analysis functions specific to Wasm.
Enumerates target-specific builtins in their own namespaces within namespace clang.
C Language Family Type Representation.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
bool isRegularKeywordAttribute() const
SourceLocation getLoc() const
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
Decl - This represents one declaration (or definition), e.g.
SourceLocation getLocation() const
This represents one expression.
Represents a prototype with parameter type info, e.g.
unsigned getNumParams() const
QualType getParamType(unsigned i) const
QualType getReturnType() const
ParsedAttr - Represents a syntactic attribute.
PointerType - C99 6.7.5.1 - Pointer Declarators.
A (possibly-)qualified type.
bool isWebAssemblyExternrefType() const
Returns true if it is a WebAssembly Externref Type.
ASTContext & getASTContext() const
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
void handleWebAssemblyImportNameAttr(Decl *D, const ParsedAttr &AL)
bool BuiltinWasmRefNullExtern(CallExpr *TheCall)
bool CheckWebAssemblyBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID, CallExpr *TheCall)
bool BuiltinWasmTableGet(CallExpr *TheCall)
Check that the first argument is a WebAssembly table, and the second is an index to use as index into...
bool BuiltinWasmTableFill(CallExpr *TheCall)
Check that the first argument is a WebAssembly table, the second is an integer, the third is the valu...
bool BuiltinWasmTableSize(CallExpr *TheCall)
Check that the argument is a WebAssembly table.
void handleWebAssemblyImportModuleAttr(Decl *D, const ParsedAttr &AL)
bool BuiltinWasmRefNullFunc(CallExpr *TheCall)
bool BuiltinWasmTestFunctionPointerSignature(const TargetInfo &TI, CallExpr *TheCall)
bool BuiltinWasmTableSet(CallExpr *TheCall)
Check that the first argumnet is a WebAssembly table, the second is an index to use as index into the...
bool BuiltinWasmRefIsNullExtern(CallExpr *TheCall)
void handleWebAssemblyExportNameAttr(Decl *D, const ParsedAttr &AL)
WebAssemblyImportNameAttr * mergeImportNameAttr(Decl *D, const WebAssemblyImportNameAttr &AL)
WebAssemblyImportModuleAttr * mergeImportModuleAttr(Decl *D, const WebAssemblyImportModuleAttr &AL)
bool BuiltinWasmTableGrow(CallExpr *TheCall)
Check that the first argument is a WebAssembly table, the second is the value to use for new elements...
bool BuiltinWasmTableCopy(CallExpr *TheCall)
Check that the first argument is a WebAssembly table, the second is also a WebAssembly table (of the ...
Sema - This implements semantic analysis and AST building for C.
Encodes a location in the source.
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
Exposes information about the current target.
virtual StringRef getABI() const
Get the ABI currently in use.
The base class of the type hierarchy.
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
const T * getAs() const
Member-template getAs<specific type>'.
Defines the clang::TargetInfo interface.
The JSON file list parser is used to communicate input to InstallAPI.
static bool CheckWasmBuiltinArgIsTable(Sema &S, CallExpr *E, unsigned ArgIndex, QualType &ElTy)
Checks the argument at the given index is a WebAssembly table and if it is, sets ElTy to the element ...
static bool CheckWasmBuiltinArgIsInteger(Sema &S, CallExpr *E, unsigned ArgIndex)
Checks the argument at the given index is an integer.
const FunctionProtoType * T
bool isFuncOrMethodForAttrSubject(const Decl *D)
isFuncOrMethodForAttrSubject - Return true if the given decl has function type (function or function-...
U cast(CodeGen::Address addr)