From 4a3741bf02eb51c377312bdabc979e5ccbf5bf89 Mon Sep 17 00:00:00 2001 From: grischka Date: Sun, 20 Nov 2016 14:50:56 +0100 Subject: x86_64-asm: =m operand fixes The problem was with tcctest.c: unsigned set; __asm__("btsl %1,%0" : "=m"(set) : "Ir"(20) : "cc"); when with tcc compiled with the HAVE_SELINUX option, run with tcc -run, it would use large addresses far beyond the 32bits range when tcc did not use the pc-relative mode for accessing 'set' in global data memory. In fact the assembler did not know about %rip at all. Changes: - memory operands use (%rax) not (%eax) - conversion from VT_LLOCAL: use type VT_PTR - support 'k' modifier - support %rip register - support X(%rip) pc-relative addresses The test in tcctest.c is from Michael Matz. --- tccasm.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'tccasm.c') diff --git a/tccasm.c b/tccasm.c index 911fd48..cff4b98 100644 --- a/tccasm.c +++ b/tccasm.c @@ -977,7 +977,8 @@ static void subst_asm_operands(ASMOperand *operands, int nb_operands, } modifier = 0; if (*str == 'c' || *str == 'n' || - *str == 'b' || *str == 'w' || *str == 'h') + *str == 'b' || *str == 'w' || + *str == 'h' || *str == 'k') modifier = *str++; index = find_constraint(operands, nb_operands, str, &str); if (index < 0) @@ -1029,7 +1030,8 @@ static void parse_asm_operands(ASMOperand *operands, int *nb_operands_ptr, skip('('); gexpr(); if (is_output) { - test_lvalue(); + if (!(vtop->type.t & VT_ARRAY)) + test_lvalue(); } else { /* we want to avoid LLOCAL case, except when the 'm' constraint is used. Note that it may come from -- cgit v1.3.1