From: Götz Lindenmaier Date: Fri, 28 Feb 2003 20:31:38 +0000 (+0000) Subject: Added support for debug callback. Not generated by crecoder, files X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=7e4683f809ed86a50eaa87690ac0616b5e840258;p=libfirm Added support for debug callback. Not generated by crecoder, files as handimplemented sources are linked into libfirmjni.so [r849] --- diff --git a/firmjni/Dbginfo.c b/firmjni/Dbginfo.c new file mode 100644 index 000000000..5e1113400 --- /dev/null +++ b/firmjni/Dbginfo.c @@ -0,0 +1,57 @@ +/** + * @file firmjni/Dbginfo.cc + * + * + * + * @author Goetz Lindenmaier + * CVS-ID: $Id$ + * Copyright (c) 2003 University of Karlsruhe + * Created: 26.2.2003 + * Project: Recoder frontend for libfirm + * + * + */ +#include "Dbginfo.h" + +#include +#include "dbginfo.h" +#include + +static jmethodID pair_id; +static jmethodID sets_id; +static JNIEnv *my_env_jni_; +static jclass my_cls_jni_; + +static void +my_dbg_info_merge_pair(ir_node *nw, ir_node *old, dbg_action info) { + if (pair_id) { + (*my_env_jni_)->CallStaticVoidMethod(my_env_jni_, my_cls_jni_, pair_id, nw, old, info); + } +} + +static void +my_dbg_info_merge_sets(ir_node **new_nodes, int n_new_nodes, + ir_node **old_nodes, int n_old_nodes, + dbg_action info) { + if (sets_id) { + /* Convert argument arrays to java arrays. */ + jintArray j_new_nodes = (*my_env_jni_)->NewIntArray(my_env_jni_, n_new_nodes); + jintArray j_old_nodes = (*my_env_jni_)->NewIntArray(my_env_jni_, n_old_nodes); + if (j_new_nodes) + (*my_env_jni_)->SetIntArrayRegion(my_env_jni_, j_new_nodes, 0, n_new_nodes, (jint *)new_nodes); + if (j_old_nodes) + (*my_env_jni_)->SetIntArrayRegion(my_env_jni_, j_old_nodes, 0, n_old_nodes, (jint *)old_nodes); + + (*my_env_jni_)->CallStaticVoidMethod(my_env_jni_, my_cls_jni_, sets_id, j_new_nodes, j_old_nodes, info); + } +} + + +void Java_firmjni_Dbginfo_dbgInit (JNIEnv *env_jni_, jclass cls_jni_) { + pair_id = (*env_jni_)->GetStaticMethodID(env_jni_, cls_jni_, "myJavaDbgInfoMergePair", "(III)V"); + sets_id = (*env_jni_)->GetStaticMethodID(env_jni_, cls_jni_, "myJavaDbgInfoMergeSets", "([I[II)V"); + my_env_jni_ = env_jni_; + my_cls_jni_ = cls_jni_; + + dbg_init(&my_dbg_info_merge_pair, &my_dbg_info_merge_sets); +} diff --git a/firmjni/Dbginfo.java b/firmjni/Dbginfo.java new file mode 100644 index 000000000..61975a36c --- /dev/null +++ b/firmjni/Dbginfo.java @@ -0,0 +1,43 @@ +package firmjni; + +/** + * @(#)Mydbginfo.java + * + * @author Goetz Lindenmaier + * CVS-ID: $Id$ + * Copyright (c) 2003 University of Karlsruhe + * All rights reserved. + * Use is subject to license terms. + * Created: 26.2.2003 + * Project: Recoder frontend for libfirm + * + * Please report bugs with a detailed description to + * goetz@ipd.info.uni-karlsruhe.de + */ + +import firmjni.*; + +public class Dbginfo { + + // Set env var LD_LIBRARY_PATH accordingly. + static { + System.loadLibrary("firmjni"); + } + + public static native void dbgInit (); + + public static void myJavaDbgInfoMergePair(int new_node, int old_node, int info) { + System.out.println("new Node " + Irnode.getIrnNodeNr(new_node)); + System.out.println("old Node " + Irnode.getIrnNodeNr(old_node)); + } + + public static void myJavaDbgInfoMergeSets(int new_nodes[], int old_nodes[], int info) { + System.out.print("new Nodes: "); + for (int i = 0; i < new_nodes.length; i++) + System.out.print(Irnode.getIrnNodeNr(new_nodes[i]) + ", "); + System.out.print("\nold Nodes: "); + for (int i = 0; i < old_nodes.length; i++) + System.out.print(Irnode.getIrnNodeNr(old_nodes[i]) + ", "); + System.out.println(""); + } +} diff --git a/firmjni/Makefile.in b/firmjni/Makefile.in index 168b5920c..2d4f3b1a1 100644 --- a/firmjni/Makefile.in +++ b/firmjni/Makefile.in @@ -33,13 +33,13 @@ CLASSFILES = $(MEMBERS:.m=.class) CPPFLAGS = -I$(top_srcdir)/ir/ir -I$(top_srcdir)/ir/common \ -I$(top_srcdir)/ir/ident -I$(top_srcdir)/ir/tr \ -I$(top_srcdir)/ir/tv -I$(top_srcdir)/ir/debug \ - -I$(top_srcdir)/ir/ana -I$(top_srcdir)/ir/st @CPPFLAGS@ \ - -D_SIZE_T_ + -I$(top_srcdir)/ir/ana -I$(top_srcdir)/ir/st @CPPFLAGS@ LDFLAGS += $(topdir) FIRM_HEADERS=$(notdir $(FIRM_PATH_HEADERS)) MEMBERS=$(subst .h,.m,$(shell echo $(FIRM_HEADERS)|$(SHELL_TOUPPER))) +MEMBERS += $(IMPL_MEMBERS) # How to pass function pointers? Therefore removed. # irgwalk.h typewalk.h @@ -48,7 +48,7 @@ MEMBERS=$(subst .h,.m,$(shell echo $(FIRM_HEADERS)|$(SHELL_TOUPPER))) # Irgwalk.m Typewalk.m # FIRM_PATH_HEADERS=common/firm.h common/firm_common.h \ - debug/dbginfo.h ident/ident.h tv/tv.h \ + ident/ident.h tv/tv.h \ tr/type.h tr/entity.h tr/type_or_entity.h tr/tpop.h tr/mangle.h \ ir/irprog.h ir/irgraph.h ir/irnode.h ir/irmode.h ir/irop.h \ ir/ircons.h ir/ircgcons.h ir/irflag.h ir/irvrfy.h ir/irdump.h \ @@ -57,6 +57,9 @@ FIRM_PATH_HEADERS=common/firm.h common/firm_common.h \ ir/irgmod.h tr/typegmod.h FIRM_SOURCE_DIR_HEADERS=$(addprefix $(SOURCE_DIR)/,$(FIRM_HEADERS)) +# hand implemented members +IMPL_MEMBERS = Dbginfo.m + # The directory containing crecoder.jar and, for now, # remove_cpp_comands.perl FIRM_JNI_TOOLS_DIR=$(top_srcdir)/tools @@ -76,7 +79,7 @@ classfiles: $(CLASSFILES) javafiles: $(JAVAFILES) %.class: %.java - javac $< + javac -classpath .. $< # javah renames these files. the jnibuilder doesn't anticipate this # and generates #includes with the original names. @@ -88,6 +91,12 @@ Type_or_entity.h: Type_or_entity.class ln -sf Type_0005for_0005fentity.h Type_or_entity.h javah -classpath $(topdir) -o $@ $(PACKAGENAME).$(<:.class=) + +Dbginfo.java: + cp $(srcdir)/Dbginfo.java . + cp $(srcdir)/Dbginfo.c . + + %.h: %.class javah -classpath $(topdir) -o $@ $(PACKAGENAME).$(<:.class=) @@ -147,5 +156,8 @@ $(FIRM_HEADERS):$(FIRM_SOURCE_DIR_HEADERS) $(SOURCE_DIR)/firm_typedefs.h H_FROM_JAVA=$(subst .java,.h,$(shell echo $@|$(SHELL_TOLOWER))) -%.java: $(FIRM_HEADERS) +%.java: $(FIRM_SOURCE_DIR_HEADERS) $(SOURCE_DIR)/firm_typedefs.h + gcc $(CPPFLAGS) -E -C -P $(SOURCE_DIR)/$(H_FROM_JAVA) -o $(H_FROM_JAVA) env CLASSPATH=$(FIRM_JNI_TOOLS_DIR)/crecoder.jar:$$CLASSPATH java crecoder/tools/jniBuilder/BuildJNI $(H_FROM_JAVA);\ + rm $(H_FROM_JAVA); +# remove the patched header so that further compilation finds the proper firm headers diff --git a/firmjni/testprograms/IfElseExample.java b/firmjni/testprograms/IfElseExample.java index 5e3fe3de3..dd4c7fb24 100644 --- a/firmjni/testprograms/IfElseExample.java +++ b/firmjni/testprograms/IfElseExample.java @@ -29,8 +29,9 @@ class IfElseExample { System.out.println("\nCreating an IR graph: IfElseExample..."); - /* init library: Java did not support the callback, so ALWAYS use 0 here */ + /* init library */ Firm.initFirm(0); + Dbginfo.dbgInit(); /** Build type information for the compilation unit. **/