https://llvm.org/bugs/show_bug.cgi?id=24501
Bug ID: 24501
Summary: unsupported inline asm: input with type 'int' matching
output with type 'unsigned long long'
Product: clang
Version: 3.4
Hardware: PC
OS: Linux
Status: NEW
Severity: normal
Priority: P
Component: Frontend
Assignee: [email protected]
Reporter: [email protected]
CC: [email protected]
Classification: Unclassified
Created attachment 14747
--> https://llvm.org/bugs/attachment.cgi?id=14747&action=edit
The test case file used to reproduce the error
This defect was first found when we try to build the open source
FFmpeg:valgrind.h. while it builds fine with GCC, clang gives errors as
follows.
------------------------------------------------------------------------------
To reproduce:
> cat q.C
#include <valgrind/valgrind.h>
> clang q.C
In file included from q.C:1:
/usr/include/valgrind/valgrind.h:4516:47: error: unsupported inline asm: input
with type 'int' matching output with
type 'volatile unsigned long long'
_qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
/usr/include/valgrind/valgrind.h:646:49: note: expanded from macro
'VALGRIND_DO_CLIENT_REQUEST_EXPR'
: "a" (&_zzq_args[0]), "0" (_zzq_default) \
^
/usr/include/valgrind/valgrind.h:4554:47: error: unsupported inline asm: input
with type 'int' matching output with
type 'volatile unsigned long long'
_qzz_res = VALGRIND_DO_CLIENT_REQUEST_EXPR(0,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
/usr/include/valgrind/valgrind.h:646:49: note: expanded from macro
'VALGRIND_DO_CLIENT_REQUEST_EXPR'
: "a" (&_zzq_args[0]), "0" (_zzq_default) \
^
2 errors generated.
Error while processing q.C.
------------------------------------------------------------------------------
Because the valgrind.h is so large. I spent some time reducing it to a very
small test case (expand the macro _zzq_default, remove unrelated other parts),
which can still reproduce the above error. As follows:
------------------------------------------------------------------------------
> cat q.C
void VALGRIND_PRINTF(const char *format, ...)
{
unsigned long _qzz_res = ({
unsigned long long int _zzq_result;
__asm__ volatile("lgr 3,%1"
: "=d" (_zzq_result)
: "0" (/*(unsigned long long)i*/0)
);
_zzq_result; });
}
> clang q.C
q.C:7:57: error: unsupported inline asm: input with type 'int' matching output
with type 'unsigned long long'
: "0" (/*(unsigned long long)i*/0)
^
1 error generated.
------------------------------------------------------------------------------
If I explicitly cast 0 to unsigned long long, there will be no error. While I
agree it is dangerous to cast "unsigned long long" to "int" (bug #14408), but I
think it will be nice to make clang implicitly cast "int" to "unsigned long
long" in this case. Furthermore, it seems that only some type promotion work
need to be done in function Sema::ActOnGCCAsmStmt().
------------------------------------------------------------------------------
This bug exists in clang 3.4,3.5 and 3.6.
--
You are receiving this mail because:
You are on the CC list for the bug.
_______________________________________________
llvm-bugs mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs