[clang][CGStmt] fix crash on invalid asm statement
Clang is crashing on the following statement
char var[9];
__asm__ ("" : "=r" (var) : "0" (var));
This is similar to existing test: crbug_999160_regtest
The issue happens when EmitAsmStmt is trying to convert input to match
output type length. However, that is not guaranteed to be successful all the
time and if the statement itself is invalid like having an array type in
the example, we should give a regular error message here instead of
using assert().
Reviewed By: MaskRay
Differential Revision: https://reviews.llvm.org/D120596
This commit is contained in:
parent
daba823622
commit
f76d3b800f
|
|
@ -2518,10 +2518,8 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) {
|
|||
Arg = Builder.CreateZExt(Arg, OutputTy);
|
||||
else if (isa<llvm::PointerType>(OutputTy))
|
||||
Arg = Builder.CreateZExt(Arg, IntPtrTy);
|
||||
else {
|
||||
assert(OutputTy->isFloatingPointTy() && "Unexpected output type");
|
||||
else if (OutputTy->isFloatingPointTy())
|
||||
Arg = Builder.CreateFPExt(Arg, OutputTy);
|
||||
}
|
||||
}
|
||||
// Deal with the tied operands' constraint code in adjustInlineAsmType.
|
||||
ReplaceConstraint = OutputConstraints[Output];
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
// RUN: %clang_cc1 -triple=x86_64-unknown-linux-gnu -DPOSSIBLE_X -emit-llvm %s -o - 2>&1 | FileCheck %s --check-prefix=CHECK-X
|
||||
// RUN: not %clang_cc1 -triple=x86_64-unknown-linux-gnu -DIMPOSSIBLE_X -emit-llvm %s -o - 2>&1 | FileCheck %s --check-prefix=CHECK-IMPOSSIBLE_X
|
||||
// RUN: not %clang_cc1 -triple=x86_64-unknown-linux-gnu -DIMPOSSIBLE_9BYTES -emit-llvm %s -o - 2>&1 | FileCheck %s --check-prefix=CHECK-IMPOSSIBLE_9BYTES
|
||||
// RUN: not %clang_cc1 -triple=x86_64-unknown-linux-gnu -DIMPOSSIBLE_9BYTES_V2 -emit-llvm %s -o - 2>&1 | FileCheck %s --check-prefix=CHECK-IMPOSSIBLE_9BYTES_V2
|
||||
|
||||
// Make sure Clang doesn't treat |lockval| as asm input.
|
||||
void _raw_spin_lock(void) {
|
||||
|
|
@ -115,3 +116,11 @@ void crbug_999160_regtest(void) {
|
|||
}
|
||||
|
||||
// CHECK-IMPOSSIBLE_9BYTES: impossible constraint in asm: can't store value into a register
|
||||
|
||||
void crbug_999160_regtest_v2(void) {
|
||||
#ifdef IMPOSSIBLE_9BYTES_V2
|
||||
char buf[9];
|
||||
asm("" : "=r"(buf) : "0"(buf));
|
||||
#endif
|
||||
}
|
||||
// CHECK-IMPOSSIBLE_9BYTES_V2: impossible constraint in asm: can't store value into a register
|
||||
|
|
|
|||
Loading…
Reference in New Issue