[cfe-dev] clang trunk: extern "C"/static problem
John McCall
rjmccall at apple.com
Thu Mar 14 10:00:38 PDT 2013
On Mar 14, 2013, at 8:14 AM, "Richtarsky, Martin" <martin.richtarsky at sap.com> wrote:
>> -----Original Message-----
>> From: Rafael Espíndola [mailto:rafael.espindola at gmail.com]
>> Sent: Donnerstag, 14. März 2013 15:42
>> To: Richtarsky, Martin
>> Cc: cfe-dev at cs.uiuc.edu Developers; John McCall; Richard Smith
>> Subject: Re: [cfe-dev] clang trunk: extern "C"/static problem
>>
>> On 14 March 2013 09:34, Richtarsky, Martin <martin.richtarsky at sap.com> wrote:
>>> Hi,
>>>
>>> it seems there is a bug in current trunk with regards to the symbols that
>> are generated. At least clang 3.1, gcc 4.3.4 and gcc 4.8 behave differently
>> here.
>>>
>>> test.cpp:
>>>
>>> extern "C"
>>> {
>>>
>>> static void __attribute__((__used__)) func(char *a, char b)
>>> {
>>> }
>>>
>>> }
>>>
>>> clang++ test.cpp
>>>
>>> nm -C test*.o shows these generated symbols for the different compilers:
>>>
>>> test_clang31.o:
>>> 0000000000000000 t func
>>>
>>> test_clang33.o:
>>> 0000000000000000 t func(char*, char)
>>>
>>> test_gcc43.o:
>>> U __gxx_personality_v0
>>> 0000000000000000 t func
>>>
>>> test_gcc48.o:
>>> 0000000000000000 t func
>>>
>>>
>>> It looks like the static in conjunction with the extern "C" is causing a
>> problem here. Should I file a bug?
>>
>> The c++ standard
>> (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3376.pdf)
>> says
>>
>> ------------------
>> All function types, function names with external linkage, and variable
>> names with external linkage have a language linkage.
>> ------------------
>>
>> Since static functions have internal linkage, they don't have a
>> language linkage. That is, the extern "C" doesn't apply.
>>
>> This was recently implemented in clang, and there was some discussion
>> about maybe trying to change the standard instead. What problems is
>> this causing?
>
> Hi Rafael,
>
> in this case the affected function is called from another function which is implemented in inline assembler, within the extern "C" scope.
Ah, you know, I can't believe we didn't think about inline assembly when we were enumerating potential places where this would bite us. Too fixated on the JIT case, I suppose.
Personally, I think this basically kills the idea of treating these as overloadable, although I suppose you could try to hook it in to attribute((used)) if you *really* want to maintain that.
John.
More information about the cfe-dev
mailing list