On Thu, Jun 11, 2015 at 11:19 AM, Ahmed Bougacha <[email protected]> wrote:
> Author: ab > Date: Thu Jun 11 13:19:34 2015 > New Revision: 239549 > > URL: http://llvm.org/viewvc/llvm-project?rev=239549&view=rev > Log: > [CodeGen] Emit Constants for immediate inlineasm arguments. > > For inline assembly immediate constraints, we currently always use > EmitScalarExpr, instead of directly emitting the constant. When the > overflow sanitizer is enabled, this generates overflow intrinsics > instead of constants. > > Instead, emit a constant for constraints that either require an > immediate (e.g. 'I' on X86), or only accepts constants (immediate > or symbolic; i.e., don't accept registers or memory). > > Fixes PR19763. > > Differential Revision: http://reviews.llvm.org/D10255 > > Added: > cfe/trunk/test/CodeGen/inline-asm-immediate-ubsan.c > Modified: > cfe/trunk/lib/CodeGen/CGStmt.cpp > > Modified: cfe/trunk/lib/CodeGen/CGStmt.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGStmt.cpp?rev=239549&r1=239548&r2=239549&view=diff > > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGStmt.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGStmt.cpp Thu Jun 11 13:19:34 2015 > @@ -1750,6 +1750,16 @@ llvm::Value* CodeGenFunction::EmitAsmInp > const TargetInfo::ConstraintInfo > &Info, > const Expr *InputExpr, > std::string &ConstraintStr) { > + // If this can't be a register or memory, i.e., has to be a constant > + // (immediate or symbolic), try to emit it as such. > + if (!Info.allowsRegister() && !Info.allowsMemory()) { > + llvm::APSInt Result; > + if (InputExpr->isIntegerConstantExpr(Result, getContext())) > Please use EvaluateKnownConstInt here instead. This construct will redundantly re-check whether the expression is an ICE first. + return llvm::ConstantInt::get(getLLVMContext(), Result); > + assert(!Info.requiresImmediateConstant() && > + "Required-immediate inlineasm arg isn't constant?"); > + } > + > if (Info.allowsRegister() || !Info.allowsMemory()) > if (CodeGenFunction::hasScalarEvaluationKind(InputExpr->getType())) > return EmitScalarExpr(InputExpr); > > Added: cfe/trunk/test/CodeGen/inline-asm-immediate-ubsan.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/inline-asm-immediate-ubsan.c?rev=239549&view=auto > > ============================================================================== > --- cfe/trunk/test/CodeGen/inline-asm-immediate-ubsan.c (added) > +++ cfe/trunk/test/CodeGen/inline-asm-immediate-ubsan.c Thu Jun 11 > 13:19:34 2015 > @@ -0,0 +1,25 @@ > +// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s \ > +// RUN: -fsanitize=signed-integer-overflow \ > +// RUN: | FileCheck %s --check-prefix=CHECK > + > +// Verify we emit constants for "immediate" inline assembly arguments. > +// Emitting a scalar expression can make the immediate be generated as > +// overflow intrinsics, if the overflow sanitizer is enabled. > + > +// Check both 'i' and 'I': > +// - 'i' accepts symbolic constants. > +// - 'I' doesn't, and is really an immediate-required constraint. > + > +// See also PR23517. > + > +// CHECK-LABEL: @test_inlineasm_i > +// CHECK: call void asm sideeffect "int $0", "i{{.*}}"(i32 2) > +void test_inlineasm_i() { > + __asm__ __volatile__("int %0" :: "i"(1 + 1)); > +} > + > +// CHECK-LABEL: @test_inlineasm_I > +// CHECK: call void asm sideeffect "int $0", "I{{.*}}"(i32 2) > +void test_inlineasm_I() { > + __asm__ __volatile__("int %0" :: "I"(1 + 1)); > +} > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
