<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Thu, Jun 11, 2015 at 11:19 AM, Ahmed Bougacha <span dir="ltr"><<a href="mailto:ahmed.bougacha@gmail.com" target="_blank">ahmed.bougacha@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: ab<br>
Date: Thu Jun 11 13:19:34 2015<br>
New Revision: 239549<br>
<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D239549-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=iCUUb_R53N6c6lMjnbwP6IO4cLfu29ZDWbEde8DEkhU&s=vF6amuFKzlDTmW36CkiVbn34o39Q4Uf_RxG1KPP-Kzc&e=" target="_blank">http://llvm.org/viewvc/llvm-project?rev=239549&view=rev</a><br>
Log:<br>
[CodeGen] Emit Constants for immediate inlineasm arguments.<br>
<br>
For inline assembly immediate constraints, we currently always use<br>
EmitScalarExpr, instead of directly emitting the constant. When the<br>
overflow sanitizer is enabled, this generates overflow intrinsics<br>
instead of constants.<br>
<br>
Instead, emit a constant for constraints that either require an<br>
immediate (e.g. 'I' on X86), or only accepts constants (immediate<br>
or symbolic; i.e., don't accept registers or memory).<br>
<br>
Fixes PR19763.<br>
<br>
Differential Revision: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D10255&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=iCUUb_R53N6c6lMjnbwP6IO4cLfu29ZDWbEde8DEkhU&s=t-7imLQByb6jioMHTrcTJSuoZfff0R5Vkn7162dEnWU&e=" target="_blank">http://reviews.llvm.org/D10255</a><br>
<br>
Added:<br>
    cfe/trunk/test/CodeGen/inline-asm-immediate-ubsan.c<br>
Modified:<br>
    cfe/trunk/lib/CodeGen/CGStmt.cpp<br>
<br>
Modified: cfe/trunk/lib/CodeGen/CGStmt.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_CodeGen_CGStmt.cpp-3Frev-3D239549-26r1-3D239548-26r2-3D239549-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=iCUUb_R53N6c6lMjnbwP6IO4cLfu29ZDWbEde8DEkhU&s=WV_hjMxiVi8RqKxGu_nqjJ-HpZvapGyzw-8BW2oqEx0&e=" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGStmt.cpp?rev=239549&r1=239548&r2=239549&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CGStmt.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/CGStmt.cpp Thu Jun 11 13:19:34 2015<br>
@@ -1750,6 +1750,16 @@ llvm::Value* CodeGenFunction::EmitAsmInp<br>
                                          const TargetInfo::ConstraintInfo &Info,<br>
                                            const Expr *InputExpr,<br>
                                            std::string &ConstraintStr) {<br>
+  // If this can't be a register or memory, i.e., has to be a constant<br>
+  // (immediate or symbolic), try to emit it as such.<br>
+  if (!Info.allowsRegister() && !Info.allowsMemory()) {<br>
+    llvm::APSInt Result;<br>
+    if (InputExpr->isIntegerConstantExpr(Result, getContext()))<br></blockquote><div><br></div><div>Please use EvaluateKnownConstInt here instead. This construct will redundantly re-check whether the expression is an ICE first.</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+      return llvm::ConstantInt::get(getLLVMContext(), Result);<br>
+    assert(!Info.requiresImmediateConstant() &&<br>
+           "Required-immediate inlineasm arg isn't constant?");<br>
+  }<br>
+<br>
   if (Info.allowsRegister() || !Info.allowsMemory())<br>
     if (CodeGenFunction::hasScalarEvaluationKind(InputExpr->getType()))<br>
       return EmitScalarExpr(InputExpr);<br>
<br>
Added: cfe/trunk/test/CodeGen/inline-asm-immediate-ubsan.c<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_test_CodeGen_inline-2Dasm-2Dimmediate-2Dubsan.c-3Frev-3D239549-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=iCUUb_R53N6c6lMjnbwP6IO4cLfu29ZDWbEde8DEkhU&s=Qvb4lMhYru6XiPKRjefLfIgdcXglfIw7TqMBNCSxLF4&e=" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/inline-asm-immediate-ubsan.c?rev=239549&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGen/inline-asm-immediate-ubsan.c (added)<br>
+++ cfe/trunk/test/CodeGen/inline-asm-immediate-ubsan.c Thu Jun 11 13:19:34 2015<br>
@@ -0,0 +1,25 @@<br>
+// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s \<br>
+// RUN:     -fsanitize=signed-integer-overflow \<br>
+// RUN:   | FileCheck %s --check-prefix=CHECK<br>
+<br>
+// Verify we emit constants for "immediate" inline assembly arguments.<br>
+// Emitting a scalar expression can make the immediate be generated as<br>
+// overflow intrinsics, if the overflow sanitizer is enabled.<br>
+<br>
+// Check both 'i' and 'I':<br>
+// - 'i' accepts symbolic constants.<br>
+// - 'I' doesn't, and is really an immediate-required constraint.<br>
+<br>
+// See also PR23517.<br>
+<br>
+// CHECK-LABEL: @test_inlineasm_i<br>
+// CHECK: call void asm sideeffect "int $0", "i{{.*}}"(i32 2)<br>
+void test_inlineasm_i() {<br>
+  __asm__ __volatile__("int %0" :: "i"(1 + 1));<br>
+}<br>
+<br>
+// CHECK-LABEL: @test_inlineasm_I<br>
+// CHECK: call void asm sideeffect "int $0", "I{{.*}}"(i32 2)<br>
+void test_inlineasm_I() {<br>
+  __asm__ __volatile__("int %0" :: "I"(1 + 1));<br>
+}<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>