Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 9 Jun 2008 03:03:21 GMT
From:      John Birrell <jb@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 143150 for review
Message-ID:  <200806090303.m5933LQN050636@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=143150

Change 143150 by jb@freebsd3 on 2008/06/09 03:02:24

	Add CTF support.

Affected files ...

.. //depot/projects/dtrace6/src/sys/kern/kern_ctf.c#1 add
.. //depot/projects/dtrace6/src/sys/kern/link_elf.c#2 edit
.. //depot/projects/dtrace6/src/sys/kern/link_elf_obj.c#2 edit

Differences ...

==== //depot/projects/dtrace6/src/sys/kern/link_elf.c#2 (text+ko) ====

@@ -60,6 +60,10 @@
 
 #include <sys/link_elf.h>
 
+#ifdef DDB_CTF
+#include <net/zlib.h>
+#endif
+
 #include "linker_if.h"
 
 #define MAXSEGS 4
@@ -96,11 +100,18 @@
     long		ddbstrcnt;	/* number of bytes in string table */
     caddr_t		symbase;	/* malloc'ed symbold base */
     caddr_t		strbase;	/* malloc'ed string base */
+    caddr_t		ctftab;		/* CTF table */
+    long		ctfcnt;		/* number of bytes in CTF table */
+    caddr_t		ctfoff;		/* CTF offset table */
+    caddr_t		typoff;		/* Type offset table */
+    long		typlen;		/* Number of type entries. */
 #ifdef GDB
     struct link_map	gdb;		/* hooks for gdb */
 #endif
 } *elf_file_t;
 
+#include <kern/kern_ctf.c>
+
 static int	link_elf_link_common_finish(linker_file_t);
 static int	link_elf_link_preload(linker_class_t cls,
 				      const char*, linker_file_t*);
@@ -119,6 +130,9 @@
 static int	link_elf_each_function_name(linker_file_t,
 				int (*)(const char *, void *),
 				void *);
+static int	link_elf_each_function_nameval(linker_file_t,
+				linker_function_nameval_callback_t,
+				void *);
 static void	link_elf_reloc_local(linker_file_t);
 static Elf_Addr	elf_lookup(linker_file_t lf, Elf_Size symidx, int deps);
 
@@ -132,6 +146,8 @@
     KOBJMETHOD(linker_link_preload_finish, link_elf_link_preload_finish),
     KOBJMETHOD(linker_lookup_set,	link_elf_lookup_set),
     KOBJMETHOD(linker_each_function_name, link_elf_each_function_name),
+    KOBJMETHOD(linker_each_function_nameval, link_elf_each_function_nameval),
+    KOBJMETHOD(linker_ctf_get,          link_elf_ctf_get),
     { 0, 0 }
 };
 
@@ -899,6 +915,12 @@
 	free(ef->symbase, M_LINKER);
     if (ef->strbase)
 	free(ef->strbase, M_LINKER);
+    if (ef->ctftab)
+	free(ef->ctftab, M_LINKER);
+    if (ef->ctfoff)
+	free(ef->ctfoff, M_LINKER);
+    if (ef->typoff)
+	free(ef->typoff, M_LINKER);
 }
 
 static void
@@ -1216,6 +1238,30 @@
     return (0);
 }
 
+static int
+link_elf_each_function_nameval(linker_file_t file,
+    linker_function_nameval_callback_t callback, void *opaque)
+{
+	linker_symval_t symval;
+	elf_file_t ef = (elf_file_t)file;
+	const Elf_Sym* symp;
+	int i, error;
+
+	/* Exhaustive search */
+	for (i = 0, symp = ef->ddbsymtab; i < ef->ddbsymcnt; i++, symp++) {
+		if (symp->st_value != 0 &&
+		    ELF_ST_TYPE(symp->st_info) == STT_FUNC) {
+			error = link_elf_symbol_values(file, (c_linker_sym_t) symp, &symval);
+			if (error)
+				return (error);
+			error = callback(file, i, &symval, opaque);
+			if (error)
+				return (error);
+		}
+	}
+	return (0);
+}
+
 #ifdef __ia64__
 /*
  * Each KLD has its own GP. The GP value for each load module is given by

==== //depot/projects/dtrace6/src/sys/kern/link_elf_obj.c#2 (text+ko) ====

@@ -56,6 +56,10 @@
 
 #include <sys/link_elf.h>
 
+#ifdef DDB_CTF
+#include <net/zlib.h>
+#endif
+
 #include "linker_if.h"
 
 typedef struct {
@@ -104,8 +108,15 @@
 	caddr_t		shstrtab;	/* Section name string table */
 	long		shstrcnt;	/* number of bytes in string table */
 
+	caddr_t		ctftab;		/* CTF table */
+	long		ctfcnt;		/* number of bytes in CTF table */
+	caddr_t		ctfoff;		/* CTF offset table */
+	caddr_t		typoff;		/* Type offset table */
+	long		typlen;		/* Number of type entries. */
 } *elf_file_t;
 
+#include <kern/kern_ctf.c>
+
 static int	link_elf_link_preload(linker_class_t cls,
 		    const char *, linker_file_t *);
 static int	link_elf_link_preload_finish(linker_file_t);
@@ -122,6 +133,9 @@
 		    void ***, void ***, int *);
 static int	link_elf_each_function_name(linker_file_t,
 		    int (*)(const char *, void *), void *);
+static int	link_elf_each_function_nameval(linker_file_t,
+				linker_function_nameval_callback_t,
+				void *);
 static void	link_elf_reloc_local(linker_file_t);
 
 static Elf_Addr elf_obj_lookup(linker_file_t lf, Elf_Size symidx, int deps);
@@ -136,6 +150,8 @@
 	KOBJMETHOD(linker_link_preload_finish,	link_elf_link_preload_finish),
 	KOBJMETHOD(linker_lookup_set,		link_elf_lookup_set),
 	KOBJMETHOD(linker_each_function_name,	link_elf_each_function_name),
+	KOBJMETHOD(linker_each_function_nameval, link_elf_each_function_nameval),
+	KOBJMETHOD(linker_ctf_get,		link_elf_ctf_get),
 	{ 0, 0 }
 };
 
@@ -808,6 +824,12 @@
 			free(ef->relatab, M_LINKER);
 		if (ef->progtab)
 			free(ef->progtab, M_LINKER);
+		if (ef->ctftab)
+			free(ef->ctftab, M_LINKER);
+		if (ef->ctfoff)
+			free(ef->ctfoff, M_LINKER);
+		if (ef->typoff)
+			free(ef->typoff, M_LINKER);
 		if (file->filename != NULL)
 			preload_delete_name(file->filename);
 		/* XXX reclaim module memory? */
@@ -840,6 +862,12 @@
 		free(ef->ddbstrtab, M_LINKER);
 	if (ef->shstrtab)
 		free(ef->shstrtab, M_LINKER);
+	if (ef->ctftab)
+		free(ef->ctftab, M_LINKER);
+	if (ef->ctfoff)
+		free(ef->ctfoff, M_LINKER);
+	if (ef->typoff)
+		free(ef->typoff, M_LINKER);
 }
 
 static const char *
@@ -1061,6 +1089,30 @@
 	return (0);
 }
 
+static int
+link_elf_each_function_nameval(linker_file_t file,
+    linker_function_nameval_callback_t callback, void *opaque)
+{
+	linker_symval_t symval;
+	elf_file_t ef = (elf_file_t)file;
+	const Elf_Sym* symp;
+	int i, error;
+
+	/* Exhaustive search */
+	for (i = 0, symp = ef->ddbsymtab; i < ef->ddbsymcnt; i++, symp++) {
+		if (symp->st_value != 0 &&
+		    ELF_ST_TYPE(symp->st_info) == STT_FUNC) {
+			error = link_elf_symbol_values(file, (c_linker_sym_t) symp, &symval);
+			if (error)
+				return (error);
+			error = callback(file, i, &symval, opaque);
+			if (error)
+				return (error);
+		}
+	}
+	return (0);
+}
+
 /*
  * Symbol lookup function that can be used when the symbol index is known (ie
  * in relocations). It uses the symbol index instead of doing a fully fledged



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200806090303.m5933LQN050636>