C++/C mangleof inconsistency for OS X
Michel Fortin via Digitalmars-d
digitalmars-d at puremagic.com
Tue Apr 21 13:49:24 PDT 2015
On 2015-04-21 17:01:51 +0000, Dan Olson <zans.is.for.cans at yahoo.com> said:
> Dan Olson <zans.is.for.cans at yahoo.com> writes:
>
>> Jacob Carlborg <doob at me.com> writes:
>>
>>> On 2015-04-20 18:33, Dan Olson wrote:
>>>> An observation on OSX w/ 2.067: mangleof for C++ (and D) names produces
>>>> the actual object file symbol while mangleof for C names strips a
>>>> leading underscore.
>>>>
>>>> Is this intended? If so what is rationale?
>>>
>>> I don't think it's intentional. The point of "mangleof" is to evaluate
>>> to the actual mangled name, as it appears in the object file.
>>
>> Thanks Jacob.
>>
>> In that case, mangleof for extern(C) names on OS X and other systems
>> that add a leading underscore should include the underscore.
>>
>> extern(C) int x;
>> version(linux) pragma(msg, foo.mangleof); // "x"
>> version(OSX) pragma(msg, foo.mangleof); // "_x"
>>
>> I'm trying to understand because ldc is different than dmd, and it is
>> related to proper debugging on systems with leading underscores.
>> pragma(mangle, name) is wrapped up in this too. This needs to be right
>> to help D expand to other systems.
>
> Hmmm, I can see another point of view where mangleof should produce the
> equivalent extern(C) symbol. My gut says this is the way it should
> work.
>
> If I want to call a C function void debug(const char*) from a C library,
> I would do this because of D "debug" keyword:
>
> pragma(mangle, "debug")
> extern (C) void debug_c(const(char*));
>
> Now I would think debug_c.mangleof -> "debug"
> (and that is indeed what dmd produces even on OS X).
>
> On systems which prepend an underscore, we want compiler to take care of
> this so code is portable, otherwise code must do this:
>
> version (OSX)
> pragma(mangle, "_debug") extern (C) void debug_c(const(char*));
> else
> pragma(mangle, "debug") extern (C) void debug_c(const(char*));
I think if you specify the mangling most of the time it's because you
don't want the compiler to do it for you. But you should consider doing
this:
string mangleC(string name) {
version (OSX) return "_" ~ name;
else return name;
}
pragma(mangle, mangleC("debug")) extern (C) void debug_c(const(char*));
--
Michel Fortin
michel.fortin at michelf.ca
http://michelf.ca
More information about the Digitalmars-d
mailing list