rnk added inline comments.

================
Comment at: clang/lib/Sema/SemaStmtAsm.cpp:381
+    if (!Context.getTargetInfo().getCXXABI().isMicrosoft())
+      if (const auto *UO = dyn_cast<UnaryOperator>(InputExpr))
+        if (UO->getOpcode() == UO_AddrOf)
----------------
This is too narrow, there are lots of other ways to do this:
```
struct Foo { void method(); };
void f() {
  auto pmf = &Foo::method;
  asm volatile ("" : : "r"(pmf));
}
```

I think it makes sense to check for:
* An expression with a member pointer type
* Where the size of the type is larger than the size of a pointer, or word, or 
whatever proxy we normally use for the size of a general purpose register

In the Microsoft ABI, member function pointers are only sometimes 
pointer-sized. If the class uses the multiple inheritance model, it will be 
bigger and include the this-adjuster field. See the inheritance keyword docs to 
learn more:
https://learn.microsoft.com/en-us/cpp/cpp/inheritance-keywords?view=msvc-170

This also handles large pointers to data members in the MS ABI, which also has 
a wacky aggregate representation.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D138514

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

Reply via email to