Commit 6760071f by Jakub Jelinek Committed by Jakub Jelinek

re PR c++/56302 (sys/sdt.h asms stopped working at -O0)

	PR c++/56302
	* semantics.c (finish_asm_stmt): If input constraints allow
	neither register nor memory, try maybe_constant_value to get
	a constant if possible.

	* g++.dg/torture/pr56302.C: New test.
	* g++.dg/cpp0x/constexpr-56302.C: New test.
	* c-c++-common/pr56302.c: New test.

From-SVN: r196018
parent 6422242b
2013-02-13 Jakub Jelinek <jakub@redhat.com>
PR c++/56302
* semantics.c (finish_asm_stmt): If input constraints allow
neither register nor memory, try maybe_constant_value to get
a constant if possible.
2013-02-12 Jason Merrill <jason@redhat.com>
PR c++/56285
......
......@@ -1402,6 +1402,14 @@ finish_asm_stmt (int volatile_p, tree string, tree output_operands,
if (!cxx_mark_addressable (operand))
operand = error_mark_node;
}
else if (!allows_reg && !allows_mem)
{
/* If constraint allows neither register nor memory,
try harder to get a constant. */
tree constop = maybe_constant_value (operand);
if (TREE_CONSTANT (constop))
operand = constop;
}
}
else
operand = error_mark_node;
......
2013-02-13 Jakub Jelinek <jakub@redhat.com>
PR c++/56302
* g++.dg/torture/pr56302.C: New test.
* g++.dg/cpp0x/constexpr-56302.C: New test.
* c-c++-common/pr56302.c: New test.
2013-02-13 Tobias Burnus <burnus@net-b.de>
Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
......
/* PR c++/56302 */
/* { dg-do compile } */
/* { dg-options "-O0" } */
void
foo (int x)
{
__asm__ __volatile__ ("" : : "n" (-1 * (int) sizeof (&x)));
}
// PR c++/56302
// { dg-do compile }
// { dg-options "-std=c++11 -O0" }
constexpr int foo () { return 42; }
constexpr int x = foo () + 2;
void
bar ()
{
__asm ("" : : "n" (x), "n" (foo () * 7 + x));
}
// PR c++/56302
// { dg-do compile }
typedef __SIZE_TYPE__ size_t;
# define STAP_SDT_ARG_CONSTRAINT nor
# define _SDT_STRINGIFY(x) #x
# define _SDT_ARG_CONSTRAINT_STRING(x) _SDT_STRINGIFY(x)
# define _SDT_ARG(n, x) \
[_SDT_S##n] "n" ((_SDT_ARGSIGNED (x) ? 1 : -1) * (int) _SDT_ARGSIZE (x)), \
[_SDT_A##n] _SDT_ARG_CONSTRAINT_STRING (STAP_SDT_ARG_CONSTRAINT) (_SDT_ARGVAL (x))
#define _SDT_ARGARRAY(x) (__builtin_classify_type (x) == 14 \
|| __builtin_classify_type (x) == 5)
# define _SDT_ARGSIGNED(x) (!_SDT_ARGARRAY (x) \
&& __sdt_type<__typeof (x)>::__sdt_signed)
# define _SDT_ARGSIZE(x) (_SDT_ARGARRAY (x) \
? sizeof (void *) : sizeof (x))
# define _SDT_ARGVAL(x) (x)
template<typename __sdt_T>
struct __sdt_type
{
static const bool __sdt_signed = false;
};
#define __SDT_ALWAYS_SIGNED(T) \
template<> struct __sdt_type<T> { static const bool __sdt_signed = true; };
__SDT_ALWAYS_SIGNED(signed char)
__SDT_ALWAYS_SIGNED(short)
__SDT_ALWAYS_SIGNED(int)
__SDT_ALWAYS_SIGNED(long)
__SDT_ALWAYS_SIGNED(long long)
template<typename __sdt_E>
struct __sdt_type<__sdt_E[]> : public __sdt_type<__sdt_E *> {};
template<typename __sdt_E, size_t __sdt_N>
struct __sdt_type<__sdt_E[__sdt_N]> : public __sdt_type<__sdt_E *> {};
struct S { char p[8]; };
void
foo (const S &str)
{
__asm__ __volatile__ ("" : : _SDT_ARG (0, &str));
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment