Skip to content

Commit d57b88f

Browse files
committed
ok
1 parent a093a77 commit d57b88f

File tree

16 files changed

+110
-69
lines changed

16 files changed

+110
-69
lines changed

clang/include/clang/AST/ASTContext.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1675,6 +1675,9 @@ class ASTContext : public RefCountedBase<ASTContext> {
16751675
/// Return a WebAssembly externref type.
16761676
QualType getWebAssemblyExternrefType() const;
16771677

1678+
/// Return a WebAssembly non null externref type.
1679+
QualType getWebAssemblyNonNullExternrefType() const;
1680+
16781681
/// Return the unique reference to a vector type of the specified
16791682
/// element type and size.
16801683
///

clang/include/clang/AST/Type.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1145,6 +1145,9 @@ class QualType {
11451145
/// Returns true if it is a WebAssembly Externref Type.
11461146
bool isWebAssemblyExternrefType() const;
11471147

1148+
/// Returns true if it is a WebAssembly non null Externref Type.
1149+
bool isWebAssemblyNonNullExternrefType() const;
1150+
11481151
/// Returns true if it is a WebAssembly Funcref Type.
11491152
bool isWebAssemblyFuncrefType() const;
11501153

@@ -2402,6 +2405,9 @@ class alignas(TypeAlignment) Type : public ExtQualsTypeCommonBase {
24022405
/// Check if this is a WebAssembly Externref Type.
24032406
bool isWebAssemblyExternrefType() const;
24042407

2408+
/// Check if this is a WebAssembly non null Externref Type.
2409+
bool isWebAssemblyNonNullExternrefType() const;
2410+
24052411
/// Returns true if this is a WebAssembly table type: either an array of
24062412
/// reference types, or a pointer to a reference type (which can only be
24072413
/// created by array to pointer decay).

clang/include/clang/Basic/WebAssemblyReferenceTypes.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,7 @@
3636

3737
WASM_REF_TYPE("__externref_t", "externref_t", WasmExternRef, WasmExternRefTy, 10)
3838

39+
WASM_REF_TYPE("__non_null_externref_t", "non_null_externref_t", WasmNonNullExternRef, WasmNonNullExternRefTy, 10)
40+
3941
#undef WASM_TYPE
4042
#undef WASM_REF_TYPE

clang/lib/AST/ASTContext.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3550,6 +3550,7 @@ static void encodeTypeForFunctionPointerAuth(const ASTContext &Ctx,
35503550
#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) case BuiltinType::Id:
35513551
#include "clang/Basic/AMDGPUTypes.def"
35523552
case BuiltinType::WasmExternRef:
3553+
case BuiltinType::WasmNonNullExternRef:
35533554
#define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
35543555
#include "clang/Basic/RISCVVTypes.def"
35553556
llvm_unreachable("not yet implemented");
@@ -4584,7 +4585,8 @@ ASTContext::getBuiltinVectorTypeInfo(const BuiltinType *Ty) const {
45844585
QualType ASTContext::getWebAssemblyExternrefType() const {
45854586
if (Target->getTriple().isWasm() && Target->hasFeature("reference-types")) {
45864587
#define WASM_REF_TYPE(Name, MangledName, Id, SingletonId, AS) \
4587-
if (BuiltinType::Id == BuiltinType::WasmExternRef) \
4588+
if (BuiltinType::Id == BuiltinType::WasmExternRef || \
4589+
BuiltinType::Id == BuiltinType::WasmNonNullExternRef) \
45884590
return SingletonId;
45894591
#include "clang/Basic/WebAssemblyReferenceTypes.def"
45904592
}

clang/lib/AST/Type.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2553,6 +2553,12 @@ bool Type::isWebAssemblyExternrefType() const {
25532553
return false;
25542554
}
25552555

2556+
bool Type::isWebAssemblyNonNullExternrefType() const {
2557+
if (const auto *BT = getAs<BuiltinType>())
2558+
return BT->getKind() == BuiltinType::WasmNonNullExternRef;
2559+
return false;
2560+
}
2561+
25562562
bool Type::isWebAssemblyTableType() const {
25572563
if (const auto *ATy = dyn_cast<ArrayType>(this))
25582564
return ATy->getElementType().isWebAssemblyReferenceType();
@@ -2922,13 +2928,18 @@ bool QualType::hasNonTrivialToPrimitiveCopyCUnion(const RecordDecl *RD) {
29222928
}
29232929

29242930
bool QualType::isWebAssemblyReferenceType() const {
2925-
return isWebAssemblyExternrefType() || isWebAssemblyFuncrefType();
2931+
return isWebAssemblyExternrefType() || isWebAssemblyNonNullExternrefType() ||
2932+
isWebAssemblyFuncrefType();
29262933
}
29272934

29282935
bool QualType::isWebAssemblyExternrefType() const {
29292936
return getTypePtr()->isWebAssemblyExternrefType();
29302937
}
29312938

2939+
bool QualType::isWebAssemblyNonNullExternrefType() const {
2940+
return getTypePtr()->isWebAssemblyNonNullExternrefType();
2941+
}
2942+
29322943
bool QualType::isWebAssemblyFuncrefType() const {
29332944
return getTypePtr()->isFunctionPointerType() &&
29342945
getAddressSpace() == LangAS::wasm_funcref;

clang/lib/CodeGen/CodeGenTypes.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,9 @@ llvm::Type *CodeGenTypes::ConvertType(QualType T) {
569569
case BuiltinType::Id: { \
570570
if (BuiltinType::Id == BuiltinType::WasmExternRef) \
571571
ResultType = CGM.getTargetCodeGenInfo().getWasmExternrefReferenceType(); \
572+
else if (BuiltinType::Id == BuiltinType::WasmNonNullExternRef) \
573+
ResultType = \
574+
CGM.getTargetCodeGenInfo().getWasmNonNullExternrefReferenceType(); \
572575
else \
573576
llvm_unreachable("Unexpected wasm reference builtin type!"); \
574577
} break;

clang/lib/CodeGen/TargetInfo.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,10 @@ class TargetCodeGenInfo {
418418
/// Return the WebAssembly externref reference type.
419419
virtual llvm::Type *getWasmExternrefReferenceType() const { return nullptr; }
420420

421+
/// Return the WebAssembly externref reference type.
422+
virtual llvm::Type *getWasmNonNullExternrefReferenceType() const {
423+
return nullptr;
424+
}
421425
/// Return the WebAssembly funcref reference type.
422426
virtual llvm::Type *getWasmFuncrefReferenceType() const { return nullptr; }
423427

clang/lib/CodeGen/Targets/WebAssembly.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ class WebAssemblyTargetCodeGenInfo final : public TargetCodeGenInfo {
8989
virtual llvm::Type *getWasmExternrefReferenceType() const override {
9090
return llvm::Type::getWasm_ExternrefTy(getABIInfo().getVMContext());
9191
}
92+
virtual llvm::Type *getWasmNonNullExternrefReferenceType() const override {
93+
return llvm::Type::getWasm_NonNullExternrefTy(getABIInfo().getVMContext());
94+
}
9295
/// Return the WebAssembly funcref reference type.
9396
virtual llvm::Type *getWasmFuncrefReferenceType() const override {
9497
return llvm::Type::getWasm_FuncrefTy(getABIInfo().getVMContext());

clang/lib/Sema/SemaDecl.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13643,6 +13643,11 @@ void Sema::AddInitializerToDecl(Decl *RealDecl, Expr *Init, bool DirectInit) {
1364313643
return;
1364413644
}
1364513645

13646+
if (VDecl->getType().isWebAssemblyExternrefType() && Init->getType()->isWebAssemblyNonNullExternrefType()) {
13647+
VDecl->setInit(Init);
13648+
return;
13649+
}
13650+
1364613651
// C++11 [decl.spec.auto]p6. Deduce the type which 'auto' stands in for.
1364713652
if (VDecl->getType()->isUndeducedType()) {
1364813653
if (Init->containsErrors()) {

clang/lib/Sema/SemaExpr.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9638,6 +9638,11 @@ AssignConvertType Sema::CheckAssignmentConstraints(QualType LHSType,
96389638
return AssignConvertType::Compatible;
96399639
}
96409640

9641+
if (LHSType->isWebAssemblyExternrefType() && RHSType->isWebAssemblyNonNullExternrefType()) {
9642+
Kind = CK_NoOp;
9643+
return AssignConvertType::Compatible;
9644+
}
9645+
96419646
return AssignConvertType::Incompatible;
96429647
}
96439648

0 commit comments

Comments
 (0)