31 Expr *ArgExpr =
E->getArg(ArgIndex);
32 const auto *ATy = dyn_cast<ArrayType>(ArgExpr->
getType());
33 if (!ATy || !ATy->getElementType().isWebAssemblyReferenceType()) {
35 diag::err_wasm_builtin_arg_must_be_table_type)
38 ElTy = ATy->getElementType();
45 Expr *ArgExpr =
E->getArg(ArgIndex);
48 diag::err_wasm_builtin_arg_must_be_integer_type)
74 QualType Pointee = Context.getFunctionType(Context.VoidTy, {}, {});
77 Type = Context.getAttributedType(attr::WebAssemblyFuncref,
Type,
78 Context.getPointerType(Pointee));
152 diag::err_wasm_builtin_arg_must_match_table_element_type)
179 diag::err_wasm_builtin_arg_must_match_table_element_type)
207 diag::err_wasm_builtin_arg_must_match_table_element_type)
211 for (
int I = 2; I <= 4; I++) {
223 case WebAssembly::BI__builtin_wasm_ref_null_extern:
225 case WebAssembly::BI__builtin_wasm_ref_null_func:
227 case WebAssembly::BI__builtin_wasm_table_get:
229 case WebAssembly::BI__builtin_wasm_table_set:
231 case WebAssembly::BI__builtin_wasm_table_size:
233 case WebAssembly::BI__builtin_wasm_table_grow:
235 case WebAssembly::BI__builtin_wasm_table_fill:
237 case WebAssembly::BI__builtin_wasm_table_copy:
244WebAssemblyImportModuleAttr *
246 const WebAssemblyImportModuleAttr &AL) {
247 auto *FD = cast<FunctionDecl>(
D);
249 if (
const auto *ExistingAttr = FD->getAttr<WebAssemblyImportModuleAttr>()) {
250 if (ExistingAttr->getImportModule() == AL.getImportModule())
252 Diag(ExistingAttr->getLocation(), diag::warn_mismatched_import)
253 << 0 << ExistingAttr->getImportModule() << AL.getImportModule();
254 Diag(AL.getLoc(), diag::note_previous_attribute);
258 Diag(AL.getLoc(), diag::warn_import_on_definition) << 0;
262 WebAssemblyImportModuleAttr(
getASTContext(), AL, AL.getImportModule());
265WebAssemblyImportNameAttr *
267 auto *FD = cast<FunctionDecl>(
D);
269 if (
const auto *ExistingAttr = FD->getAttr<WebAssemblyImportNameAttr>()) {
270 if (ExistingAttr->getImportName() == AL.getImportName())
272 Diag(ExistingAttr->getLocation(), diag::warn_mismatched_import)
273 << 1 << ExistingAttr->getImportName() << AL.getImportName();
274 Diag(AL.getLoc(), diag::note_previous_attribute);
278 Diag(AL.getLoc(), diag::warn_import_on_definition) << 1;
282 WebAssemblyImportNameAttr(
getASTContext(), AL, AL.getImportName());
287 auto *FD = cast<FunctionDecl>(
D);
294 Diag(AL.
getLoc(), diag::warn_import_on_definition) << 0;
303 auto *FD = cast<FunctionDecl>(
D);
310 Diag(AL.
getLoc(), diag::warn_import_on_definition) << 1;
321 Diag(
D->getLocation(), diag::warn_attribute_wrong_decl_type)
326 auto *FD = cast<FunctionDecl>(
D);
327 if (FD->isThisDeclarationADefinition()) {
328 Diag(
D->getLocation(), diag::err_alias_is_definition) << FD << 0;
337 D->addAttr(::new (Context) WebAssemblyExportNameAttr(Context, AL, Str));
338 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.
SourceLocation getBeginLoc() const LLVM_READONLY
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this call.
Decl - This represents one declaration (or definition), e.g.
This represents one expression.
ParsedAttr - Represents a syntactic attribute.
A (possibly-)qualified 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 BuiltinWasmTableSet(CallExpr *TheCall)
Check that the first argumnet is a WebAssembly table, the second is an index to use as index into the...
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.
The base class of the type hierarchy.
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
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-...