[PATCH] D108479: [Clang] Add __builtin_addressof_nocfi
John McCall via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Nov 18 10:15:03 PST 2021
rjmccall added a comment.
In D108479#3140638 <https://reviews.llvm.org/D108479#3140638>, @samitolvanen wrote:
> In D108479#3133578 <https://reviews.llvm.org/D108479#3133578>, @rjmccall wrote:
>
>> If we do need to support constant expressions of this
>
> Yes, we need this also in constant expressions.
Okay. I assume just static initializers, and not things like template arguments?
>> I think we should have the constant evaluator produce an expression rather than an l-value, the way we do with some other builtin calls. That should stop the comparison problem more generally.
>
> Sure, I can take a look at how that would work. Basically, in `PointerExprEvaluator::VisitBuiltinCallExpr` we should not evaluate the l-value and just leave it at `Result.set(E)`?
Yes, exactly. Since the builtin already requires a constant operand in non-dependent contexts, that should be enough.
================
Comment at: clang/lib/Sema/SemaChecking.cpp:199
+/// Check that the argument to __builtin_function_start is a function.
+static bool SemaBuiltinSymbolAddress(Sema &S, CallExpr *TheCall) {
+ if (checkArgCount(S, TheCall, 1))
----------------
Please update the function name here.
================
Comment at: clang/lib/Sema/SemaChecking.cpp:208
+ if (UnaryOp->getOpcode() == UnaryOperator::Opcode::UO_AddrOf)
+ E = UnaryOp->getSubExpr();
+
----------------
It would be more general to allow any expression that we can constant-evaluate to a specific function / member function reference. That allows callers to do stuff like `__builtin_function_start((int (A::*)() const) &A::x)` to resolve overloaded function references.
You should delay this check if the operand is value-dependent.
================
Comment at: clang/lib/Sema/SemaChecking.cpp:221
+ if (ResultType.isNull())
+ return true;
+
----------------
I think we decided that the result type should be `void*`. Are there other semantic checks from `CheckAddressOfOperand` that still meaningfully apply?
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D108479/new/
https://reviews.llvm.org/D108479
More information about the cfe-commits
mailing list