Alien-LibJIT
view release on metacpan or search on metacpan
libjit/jitdynamic/jit-cpp-mangle.c view on Meta::CPAN
/*
* jit-cpp-mangle.c - Perform C++ name mangling.
*
* Copyright (C) 2004 Southern Storm Software, Pty Ltd.
*
* This file is part of the libjit library.
*
* The libjit library is free software: you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation, either version 2.1 of
* the License, or (at your option) any later version.
*
* The libjit library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with the libjit library. If not, see
* <http://www.gnu.org/licenses/>.
*/
#include <jit/jit-dynamic.h>
#include <jit/jit.h>
#include <config.h>
#include <stdio.h>
/*@
@cindex Name mangling
Sometimes you want to retrieve a C++ method from a dynamic library
using @code{jit_dynlib_get_symbol}. Unfortunately, C++ name mangling
rules differ from one system to another, making this process very
error-prone.
The functions that follow try to help. They aren't necessarily fool-proof,
but they should work in the most common cases. The only alternative is
to wrap your C++ library with C functions, so that the names are predictable.
The basic idea is that you supply a description of the C++ method that
you wish to access, and these functions return a number of candidate forms
that you can try with @code{jit_dynlib_get_symbol}. If one form fails,
you move on and try the next form, until either symbol lookup succeeds
or until all forms have been exhausted.
@noindent
The following code demonstrates how to resolve a global function:
@example
jit_dynlib_handle_t handle;
jit_type_t signature;
int form = 0;
void *address = 0;
char *mangled;
while((mangled = jit_mangle_global_function
("foo", signature, form)) != 0)
@{
address = jit_dynlib_get_symbol(handle, mangled);
if(address != 0)
@{
break;
@}
jit_free(mangled);
++form;
@}
if(address)
@{
printf("%s = 0x%lx\n", mangled, (long)address);
@}
else
@{
printf("could not resolve foo\n");
@}
@end example
This mechanism typically cannot be used to obtain the entry points for
@code{inline} methods. You will need to make other arrangements to
simulate the behaviour of inline methods, or recompile your dynamic C++
library in a mode that explicitly exports inlines.
C++ method names are very picky about types. On 32-bit systems,
@code{int} and @code{long} are the same size, but they are mangled
to different characters. To ensure that the correct function is
picked, you should use @code{jit_type_sys_int}, @code{jit_type_sys_long}, etc
instead of the platform independent types. If you do use a platform
independent type like @code{jit_type_int}, this library will try to
guess which system type you mean, but the guess will most likely be wrong.
@*/
/*
( run in 0.571 second using v1.01-cache-2.11-cpan-5b529ec07f3 )