[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [MiNT] how to compile stik/sting stuff with gcc4
Miro Kropacek wrote:
inet.c: In function 'inet_send':
inet.c:137: error: asm-specifier for variable 'retv' conflicts with asm
clobber list
Oh, this header is huge.
Here are the instructions.
The file mint/osbind.h can be used as a model.
Example:
#define trap_1_w(n) \
__extension__ \
({ \
register long retvalue __asm__("d0"); \
\
__asm__ volatile \
( \
"movw %1,sp@-\n\t" \
"trap #1\n\t" \
"addql #2,sp\n\t" \
: "=r"(retvalue) /* outputs */ \
: "g"(n) /* inputs */ \
: __CLOBBER_RETURN("d0") "d1", "d2", "a0", "a1", "a2" /* clobbered regs */ \
AND_MEMORY \
); \
retvalue; \
})
1) Use the __CLOBBER_RETURN("d0") macro in the clobber list when the output
list contain a variable mapped to d0. It is the case here for the retvalue
variable, the compiler is told to allocate it in d0. GCC 2.x requires d0 to
be put in the clobber list, but GCC 4.x is clever enough to see it on
output, then it fails. The macro does the right thing with every compiler.
It is defined in include/compiler.h
Beware, if no output variable is mapped to d0, you must use "d0" alone
without the macro !
2) Look at the end of line character. "\n\t" is the standard, it produces a
perfectly aligned assembler source code when you use gcc -S. Perfect for
debugging. ";" like in your source is valid, too, but everything is put on a
single line, so it is unreadable.
It is usually better to avoid to put "\n\t" on the last line, here it is a
bad example.
This change is not mandatory, it is only for the readability of the
intermediate assembler code.
3) Look at the multiline strings. In my example, two adjacent strings are
automatically concatened by the compiler, that's good. In your old file, the
string is opened at the beginning, it contains embedded newlines, then it is
closed at the end. This causes problems to something, I don't remember well,
if it is not GCC, it is the binutils. This should be fixed.
4) If you care about ColdFire, you should replace "addqw #8,sp" by "addql
#8,sp", which does exactly the same without performance loss, and which is
ColdFire compatible.
5) When the stack correction is >8, you should use "lea sp@(12),sp" instead
of "addw #12,sp", to be both faster and ColdFire compatible.
6) I see "a2" is missing from the clobber lists, is it really guaranteed
that it will never be trashed ?
7) The inline assembler use that horrible MIT syntax, however gas has been
supporting the normal Motorola syntax for ages.
Now, you have some work to do.
--
Vincent Rivière