r239549 - [CodeGen] Emit Constants for immediate inlineasm arguments.

Richard Smith richard at metafoo.co.uk
Thu Jun 11 14:13:50 PDT 2015


On Thu, Jun 11, 2015 at 11:19 AM, Ahmed Bougacha <ahmed.bougacha at gmail.com>
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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150611/8c79e96f/attachment.html>


More information about the cfe-commits mailing list