[PATCH] D107941: Fix assertion when passing function into inline asm's input operand
Jason Liu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Aug 27 10:40:34 PDT 2021
This revision was automatically updated to reflect the committed changes.
Closed by commit rGfe177a1773e4: Fix assertion when passing function into inline asm's input operand (authored by jasonliu).
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D107941/new/
https://reviews.llvm.org/D107941
Files:
clang/lib/Sema/SemaStmtAsm.cpp
clang/test/CodeGen/asm-call-func.c
Index: clang/test/CodeGen/asm-call-func.c
===================================================================
--- /dev/null
+++ clang/test/CodeGen/asm-call-func.c
@@ -0,0 +1,7 @@
+// RUN: %clang_cc1 -emit-llvm %s -o - -triple x86_64-unknown-linux-gnu| FileCheck %s
+
+void callee(void);
+void caller() {
+ //CHECK: call void asm sideeffect "rcall $0", "n,~{dirflag},~{fpsr},~{flags}"(void ()* @callee)
+ asm("rcall %0" ::"n"(callee));
+}
Index: clang/lib/Sema/SemaStmtAsm.cpp
===================================================================
--- clang/lib/Sema/SemaStmtAsm.cpp
+++ clang/lib/Sema/SemaStmtAsm.cpp
@@ -393,30 +393,31 @@
diag::err_asm_invalid_lvalue_in_input)
<< Info.getConstraintStr()
<< InputExpr->getSourceRange());
- } else if (Info.requiresImmediateConstant() && !Info.allowsRegister()) {
- if (!InputExpr->isValueDependent()) {
- Expr::EvalResult EVResult;
- if (InputExpr->EvaluateAsRValue(EVResult, Context, true)) {
- // For compatibility with GCC, we also allow pointers that would be
- // integral constant expressions if they were cast to int.
- llvm::APSInt IntResult;
- if (EVResult.Val.toIntegralConstant(IntResult, InputExpr->getType(),
- Context))
- if (!Info.isValidAsmImmediate(IntResult))
- return StmtError(Diag(InputExpr->getBeginLoc(),
- diag::err_invalid_asm_value_for_constraint)
- << toString(IntResult, 10)
- << Info.getConstraintStr()
- << InputExpr->getSourceRange());
- }
- }
-
} else {
ExprResult Result = DefaultFunctionArrayLvalueConversion(Exprs[i]);
if (Result.isInvalid())
return StmtError();
- Exprs[i] = Result.get();
+ InputExpr = Exprs[i] = Result.get();
+
+ if (Info.requiresImmediateConstant() && !Info.allowsRegister()) {
+ if (!InputExpr->isValueDependent()) {
+ Expr::EvalResult EVResult;
+ if (InputExpr->EvaluateAsRValue(EVResult, Context, true)) {
+ // For compatibility with GCC, we also allow pointers that would be
+ // integral constant expressions if they were cast to int.
+ llvm::APSInt IntResult;
+ if (EVResult.Val.toIntegralConstant(IntResult, InputExpr->getType(),
+ Context))
+ if (!Info.isValidAsmImmediate(IntResult))
+ return StmtError(
+ Diag(InputExpr->getBeginLoc(),
+ diag::err_invalid_asm_value_for_constraint)
+ << toString(IntResult, 10) << Info.getConstraintStr()
+ << InputExpr->getSourceRange());
+ }
+ }
+ }
}
if (Info.allowsRegister()) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D107941.369137.patch
Type: text/x-patch
Size: 2982 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210827/abe5c606/attachment-0001.bin>
More information about the cfe-commits
mailing list