aaron.ballman requested changes to this revision.
aaron.ballman added a comment.
This revision now requires changes to proceed.

Adding new types to the type system is quite invasive; was there an RFC for 
this you can point me to along with a design document? I have no idea how to 
review this because I don't know what the semantics of this type are supposed 
to be.



================
Comment at: clang/include/clang/AST/ASTContext.h:1496
 
+  /// Return a WebAssembly externref type
+  QualType getExternrefType() const;
----------------



================
Comment at: clang/include/clang/AST/Type.h:1972-1973
+  /// Check if this is a WebAssembly Reference Type.
+  bool isWebAssemblyReferenceType() const;
+  bool isWebAssemblyExternrefType() const;
   /// Determines if this is a sizeless type supported by the
----------------
It's unfortunate to name this with `ReferenceType` given that we already have a 
considerable number of APIs that assume "reference type" to mean `&` or `&&`. 
We run into similar problems with "pointer type" and objective-c pointers.

Basically, I worry we're setting ourselves up for another 
`isObjCObjectPointerType()`/`isPointerType()` situation.


================
Comment at: clang/include/clang/Basic/AddressSpaces.h:59-60
 
+  wasm_var,
+  wasm_externref,
   // This denotes the count of language-specific address spaces and also
----------------
tlively wrote:
> What is `wasm_var`? It would be good to have a short comment here (and 
> newline afterward).
Agreed; I'm not certain why `wasm_var` is part of this changeset.


================
Comment at: clang/include/clang/Basic/Attr.td:3937-3944
+def WebAssemblyFuncref : TypeAttr, TargetSpecificAttr<TargetWebAssembly> {
+  let Spellings = [Clang<"funcref">];
+  let Args = [];
+  let Documentation = [Undocumented];
+  // Represented as part of the enclosing function pointer type.
+  let ASTNode = 0;
+}
----------------
No new undocumented attributes, please. No need for the `Args` field, and 
please add the newline back to the end of the file.


================
Comment at: clang/include/clang/Basic/Builtins.def:50
 //  p -> pid_t
+//  e -> wasm externref
 //  . -> "...".  This may only occur at the end of the function list.
----------------
tlively wrote:
> 
How often do you expect to use this marking? If it's only going to be used once 
or twice, it might make sense to not steal a letter but instead use custom 
checking for the signature.


================
Comment at: clang/include/clang/Basic/DiagnosticSemaKinds.td:11683-11686
+def err_wasm_reference_pointer : Error<
+  "pointers to WebAssembly reference types are illegal">;
+def err_wasm_reference_reference : Error<
+  "references to WebAssembly reference types are illegal">;
----------------
These can be combined with a `%select`


================
Comment at: clang/include/clang/Basic/DiagnosticSemaKinds.td:11687-11690
+def err_wasm_capture_reference : Error<
+  "cannot capture WebAssembly reference">;
+def err_wasm_addrof_reference : Error<
+  "cannot take address of WebAssembly reference">;
----------------
These can also be combined with a `%select`


================
Comment at: clang/include/clang/Basic/WebAssemblyReferenceTypes.def:16
+//
+//  - Name is the name of the builtin type.  MangledName is the mangled name.
+//
----------------
What kind of mangling is this name? Itanium? Microsoft? Something else?


================
Comment at: clang/lib/AST/ASTContext.cpp:952-953
+        12, // ptr64
+        1,  // wasm_var
+        10, // wasm_externref,
     };
----------------
How did you arrive at these values?


================
Comment at: clang/lib/AST/ItaniumMangle.cpp:3147
+    type_name = MangledName;                                                   
\
+    Out << (type_name == InternalName ? "u" : "") << type_name.size()          
\
+        << type_name;                                                          
\
----------------
tlively wrote:
> Our `MangledName` is not the same as our `InternalName`, so it looks like 
> this condition will never be true. Should be follow the simpler pattern from 
> the previous two targets instead?
I'm not an Itanium mangling expert, but doesn't this *have* to use the `u` 
marking per 
https://itanium-cxx-abi.github.io/cxx-abi/abi.html#mangle.builtin-type because 
this is definitely a vendor extension type.


================
Comment at: clang/lib/AST/MicrosoftMangle.cpp:2480-2481
 #include "clang/Basic/RISCVVTypes.def"
+#define WASM_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
+#include "clang/Basic/WebAssemblyReferenceTypes.def"
   case BuiltinType::ShortAccum:
----------------
Is it reasonable that this simply cannot mangle in Microsoft ABI mode?


================
Comment at: clang/lib/AST/Type.cpp:2330-2333
+  const BuiltinType *BT = getAs<BuiltinType>();
+  if (BT && BT->getKind() == BuiltinType::WasmExternRef)
+    return true;
+  return false;
----------------



================
Comment at: clang/lib/Sema/SemaType.cpp:2179-2184
+  if (getASTContext().getTargetInfo().getTriple().isWasm()) {
+    if (T->isWebAssemblyReferenceType()) {
+      Diag(Loc, diag::err_wasm_reference_pointer);
+      return QualType();
+    }
+  }
----------------



================
Comment at: clang/lib/Sema/SemaType.cpp:2262-2267
+  if (getASTContext().getTargetInfo().getTriple().isWasm()) {
+    if (T->isWebAssemblyReferenceType()) {
+      Diag(Loc, diag::err_wasm_reference_reference);
+      return QualType();
+    }
+  }
----------------



Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D122215/new/

https://reviews.llvm.org/D122215

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to