MIPS Creator CI20 patches (again)
Paul Boddie
paul at boddie.org.uk
Tue Jan 9 23:17:10 CET 2018
On Tuesday 9. January 2018 01.02.58 Paul Boddie wrote:
>
> So, I am assuming that the compiler gets confused by the freestanding
> assembly language definition of the function, and the object goes missing
> in some way that then leads to the error. Of course, the above introduces
> other operations that are superfluous, but perhaps not harmful, due to the
> general boilerplate included in C-level functions.
>
> Anyway, I'll see if I get any response from the other discussion.
Well, I got a response that effectively describes the cause of the problem:
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=884821#25
As I understand it, the assembly language code defines a local object (the
default behaviour), but the C compiler regards it as a global object due to
the declaration used:
void __attribute__((visibility("internal"))) thread2(void);
Consequently, the linker complains about this inconsistency (but also seems to
experience an error generating the error message).
What I see from the mybuild/include/mips/l4/util/thread.h file are two macros
for defining and declaring thread functions:
- L4UTIL_THREAD_FUNC introduces a global object wrapping the actual function
- L4UTIL_THREAD_STATIC_FUNC introduces a local object wrapping the actual
function, declaring it at the C level as a global, internal object
Since we are dealing with the output of the latter macro, it seems that there
are two main alternatives that suppress the error:
- Add a ".global" directive for the introduced wrapper object in the assembly
language (as is done by the former macro), producing a global but internal
object
- Declare the object at the C level as a static object, as in...
static void thread2(void);
Another solution could involve using a C-level wrapper function and including
assembly language inside that, if necessary. Maybe someone (Sarah?) could say
what the motivations were for doing it in the current way. My hypothesis is
that extra instructions get generated for the C functions that are either
superfluous or harmful, such as accessing the stack, but I would gladly be
corrected.
Paul
More information about the l4-hackers
mailing list