gcc - para - functions php wordpress
¿Cómo agregar una función incorporada en un plugin de GCC? (0)
¿Es posible que un complemento GCC agregue una nueva función incorporada? Si es así, ¿cómo hacerlo correctamente?
La versión de GCC es 5.3 (o más reciente). El código que está siendo compilado y procesado por el complemento está escrito en C.
Se menciona en los fundamentos de los complementos de GCC en gcc-melt.org que esto es posible, pero no puedo ver cómo.
Por lo que puedo ver en las fuentes de GCC, los builtins se crean usando add_builtin_function()
de gcc / langhooks.c :
tree
add_builtin_function (const char *name,
tree type,
int function_code,
enum built_in_class cl,
const char *library_name,
tree attrs)
Está más o menos claro qué valores deben tener los argumentos de esta función, a excepción de function_code
, una identificación numérica única de la función.
Parece (ver add_builtin_function_common()
), se espera un valor de enum built_in_function
pero un complemento de GCC no puede cambiar esa enumeración.
Al parecer, no se puede pasar ningún valor aleatorio mayor que END_BUILTINS
como END_BUILTINS
function_code
. builtin_decl_implicit()
y builtin_decl_explicit()
tendrían una aserción fallida en ese caso.
Entonces, ¿cuál es la manera correcta de agregar un built-in en un plugin de GCC (sin usar MELT y tal, solo API GCC plugin)?
Actualización add_builtin_function_common()
nuevamente la implementación de add_builtin_function_common()
y de langhooks.builtin_function()
para C así como de cómo se usan en GCC. Parece que 0 es aceptable como function_code
en algunos casos. No puede usar builtin_decl_implicit()
pero puede guardar el DECL devuelto por add_builtin_function()
y usarlo más tarde.
Parece que el único evento en el que puedo intentar crear builtins de esa manera es PLUGIN_START_UNIT (de lo contrario, GCC puede bloquearse debido a que external_scope
variable external_scope
es NULL).
Intenté lo siguiente en esa etapa ( fntype
fue creado antes):
decl = add_builtin_function (
"my_helper", fntype,
0 /* function_code */,
BUILT_IN_NORMAL /* enum built_in_class cl */,
NULL /* library_name */,
NULL_TREE /* attrs */)
my_helper
se definió en un archivo fuente C diferente compilado y vinculado con el archivo fuente principal. Luego utilicé decl para insertar las llamadas a esa función en otras funciones ( gimple_build_call
) durante mi pase GIMPLE.
GCC no my_helper
errores y, de hecho, insertó la llamada a my_helper
, pero como una llamada a una función normal. De hecho, necesitaba un built-in para evitar una llamada, sino más bien insertar el cuerpo de la función.
Por otro lado, el pase "tsan0", que se ejecuta inmediatamente después de mi pase, inserta las llamadas de las funciones incorporadas tal como cabría esperar: no hay una llamada explícita como resultado, solo se inserta el cuerpo de la función. Sin embargo, sus construcciones están definidas por GCC en lugar de por los complementos.
Entonces, supongo que mi versión interna aún necesita algo para ser una versión interna válida, pero no sé qué es. Aquí es donde estoy atascado ahora.