32 Expr *ArgExpr =
E->getArg(ArgIndex);
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();
46 Expr *ArgExpr =
E->getArg(ArgIndex);
49 diag::err_wasm_builtin_arg_must_be_integer_type)
71 diag::err_wasm_builtin_arg_must_be_externref_type)
86 QualType Pointee = Context.getFunctionType(Context.VoidTy, {}, {});
89 Type = Context.getAttributedType(attr::WebAssemblyFuncref,
Type,
90 Context.getPointerType(Pointee));
164 diag::err_wasm_builtin_arg_must_match_table_element_type)
191 diag::err_wasm_builtin_arg_must_match_table_element_type)
219 diag::err_wasm_builtin_arg_must_match_table_element_type)
223 for (
int I = 2; I <= 4; I++) {
243 diag::err_typecheck_expect_function_pointer)
251 diag::err_typecheck_expect_function_pointer)
255 if (TI.
getABI() ==
"experimental-mv") {
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) {
315 auto *FD = cast<FunctionDecl>(
D);
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 *
335 auto *FD = cast<FunctionDecl>(
D);
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());
355 auto *FD = cast<FunctionDecl>(
D);
362 Diag(AL.
getLoc(), diag::warn_import_on_definition) << 0;
371 auto *FD = cast<FunctionDecl>(
D);
378 Diag(AL.
getLoc(), diag::warn_import_on_definition) << 1;
389 Diag(
D->getLocation(), diag::warn_attribute_wrong_decl_type)
394 auto *FD = cast<FunctionDecl>(
D);
395 if (FD->isThisDeclarationADefinition()) {
396 Diag(
D->getLocation(), diag::err_alias_is_definition) << FD << 0;
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.
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.
QualType getPointeeType() const
A (possibly-)qualified type.
bool isWebAssemblyExternrefType() const
Returns true if it is a WebAssembly Externref Type.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
ASTContext & getASTContext() const
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.
bool checkArgCount(CallExpr *Call, unsigned DesiredArgCount)
Checks that a call expression's argument count is the desired number.
bool checkStringLiteralArgumentAttr(const AttributeCommonInfo &CI, const Expr *E, StringRef &Str, SourceLocation *ArgLocation=nullptr)
Check if the argument E is a ASCII string literal.
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 isStructureType() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
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.
bool isFuncOrMethodForAttrSubject(const Decl *D)
isFuncOrMethodForAttrSubject - Return true if the given decl has function type (function or function-...
const FunctionProtoType * T