From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1866 invoked by alias); 25 Jun 2010 13:56:48 -0000 Received: (qmail 1849 invoked by uid 22791); 25 Jun 2010 13:56:46 -0000 X-SWARE-Spam-Status: No, hits=-1.1 required=5.0 tests=AWL,BAYES_00,KAM_STOCKGEN,TW_BJ,TW_CP,TW_XS,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mtagate3.uk.ibm.com (HELO mtagate3.uk.ibm.com) (194.196.100.163) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 25 Jun 2010 13:56:41 +0000 Received: from d06nrmr1407.portsmouth.uk.ibm.com (d06nrmr1407.portsmouth.uk.ibm.com [9.149.38.185]) by mtagate3.uk.ibm.com (8.13.1/8.13.1) with ESMTP id o5PDucTg001836 for ; Fri, 25 Jun 2010 13:56:38 GMT Received: from d06av03.portsmouth.uk.ibm.com (d06av03.portsmouth.uk.ibm.com [9.149.37.213]) by d06nrmr1407.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id o5PDucwG606340 for ; Fri, 25 Jun 2010 14:56:38 +0100 Received: from d06av03.portsmouth.uk.ibm.com (loopback [127.0.0.1]) by d06av03.portsmouth.uk.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id o5PDucTI021973 for ; Fri, 25 Jun 2010 14:56:38 +0100 Received: from leonard.localnet (dyn-9-152-224-29.boeblingen.de.ibm.com [9.152.224.29]) by d06av03.portsmouth.uk.ibm.com (8.12.11.20060308/8.12.11) with ESMTP id o5PDuXiK021785 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 25 Jun 2010 14:56:37 +0100 From: Ken Werner To: gdb-patches@sourceware.org Subject: [patch, spu] Detect OpenCL program executables Date: Fri, 25 Jun 2010 13:56:00 -0000 User-Agent: KMail/1.13.2 (Linux/2.6.32-22-generic-pae; KDE/4.4.2; i686; ; ) MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_QWLJMl/c5MH7P5b" Message-Id: <201006251556.32892.ken@linux.vnet.ibm.com> X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2010-06/txt/msg00575.txt.bz2 --Boundary-00=_QWLJMl/c5MH7P5b Content-Type: Text/Plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-length: 670 Hi, OpenCL kernels are compiled and loaded at runtime but there is no way for GDB to detect that. The problem is similar to the handling of dynamic shared libraries. Unfortunately no such mechanism exists for OpenCL programs on the SPU. This patch extends the SPU solib code to append OpenCL programs to the list of `struct so_list' objects. As OpenCL programs are loaded dynamically, the OpenCL run-time cooperates with GDB and calls __opencl_program_update_event whenever a kernel is loaded and notifies the debugger on where the code resides in memory. This approach is very similar on how GDB communicates with libspe to handle SPU programs. Regards, -ken --Boundary-00=_QWLJMl/c5MH7P5b Content-Type: text/x-patch; charset="UTF-8"; name="spu-solib.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="spu-solib.patch" Content-length: 4905 2010-06-25 Ken Werner * solib-spu.c: Include "exception.h". (ocl_program_data_key): New variable. (append_ocl_sos): New function. (ocl_enable_break): Likewise. (spu_current_sos): Call append_ocl_sos. (spu_solib_loaded): Call ocl_enable_break. (_initialize_spu_solib): Register ocl_program_data_key. Index: gdb/solib-spu.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D RCS file: /cvs/src/src/gdb/solib-spu.c,v retrieving revision 1.10 diff -u -p -r1.10 solib-spu.c --- gdb/solib-spu.c 16 May 2010 23:49:58 -0000 1.10 +++ gdb/solib-spu.c 25 Jun 2010 11:53:56 -0000 @@ -34,6 +34,7 @@ #include "observer.h" #include "breakpoint.h" #include "gdbthread.h" +#include "exceptions.h" =20 #include "spu-tdep.h" =20 @@ -94,6 +95,61 @@ spu_skip_standalone_loader (void) } } =20 +static const struct objfile_data *ocl_program_data_key; + +/* Appends OpenCL programs to the list of `struct so_list' objects. */ +static void +append_ocl_sos (struct so_list **link_ptr) +{ + CORE_ADDR *ocl_program_addr_base; + struct objfile *objfile; + + ALL_OBJFILES (objfile) + { + ocl_program_addr_base =3D objfile_data (objfile, ocl_program_data_ke= y); + if (ocl_program_addr_base !=3D NULL) + { + enum bfd_endian byte_order =3D bfd_big_endian (objfile->obfd)? + BFD_ENDIAN_BIG : BFD_ENDIAN_LITTLE; + volatile struct gdb_exception ex; + TRY_CATCH (ex, RETURN_MASK_ALL) + { + CORE_ADDR data =3D + read_memory_unsigned_integer (*ocl_program_addr_base, + sizeof (CORE_ADDR), + byte_order); + if (data !=3D 0x0) + { + struct so_list *new; + + /* Allocate so_list structure. */ + new =3D XZALLOC (struct so_list); + + /* Encode FD and object ID in path name. */ + xsnprintf (new->so_name, sizeof new->so_name, "@0x%lx <%d>", + data, SPUADDR_SPU (*ocl_program_addr_base)); + strcpy (new->so_original_name, new->so_name); + + *link_ptr =3D new; + link_ptr =3D &new->next; + } + } + if (ex.reason < 0) + { + /* Ignore memory errors. */ + switch (ex.error) + { + case MEMORY_ERROR: + break; + default: + throw_exception (ex); + break; + } + } + } + } +} + /* Build a list of `struct so_list' objects describing the shared objects currently loaded in the inferior. */ static struct so_list * @@ -170,6 +226,9 @@ spu_current_sos (void) link_ptr =3D &new->next; } =20 + /* Append OpenCL sos. */ + append_ocl_sos (link_ptr); + return head; } =20 @@ -365,6 +424,43 @@ spu_enable_break (struct objfile *objfil return 0; } =20 +/* Enable shared library breakpoint for the + OpenCL runtime running on the SPU. */ +static void +ocl_enable_break (struct objfile *objfile) +{ + struct minimal_symbol *event_sym =3D NULL; + struct minimal_symbol *addr_sym =3D NULL; + + /* The OpenCL runtime on the SPU will call __opencl_program_update_event + whenever an OpenCL program is loaded. */ + event_sym =3D lookup_minimal_symbol ("__opencl_program_update_event", NU= LL, + objfile); + /* The PPU address of the OpenCL program can be found + at opencl_elf_image_address. */ + addr_sym =3D lookup_minimal_symbol ("opencl_elf_image_address", NULL, ob= jfile); + + if (event_sym && addr_sym) + { + /* Place a solib_event breakpoint on the symbol. */ + CORE_ADDR event_addr =3D SYMBOL_VALUE_ADDRESS (event_sym); + create_solib_event_breakpoint (get_objfile_arch (objfile), event_add= r); + + /* Store the address of the symbol that will point to OpenCL program + using the per-objfile private data mechanism. */ + if (objfile_data (objfile, ocl_program_data_key) =3D=3D NULL) + { + CORE_ADDR *ocl_program_addr_base =3D OBSTACK_CALLOC ( + &objfile->objfile_obstack, + objfile->sections_end - objfile->sections, + CORE_ADDR); + *ocl_program_addr_base =3D SYMBOL_VALUE_ADDRESS (addr_sym); + set_objfile_data (objfile, ocl_program_data_key, + ocl_program_addr_base); + } + } +} + /* Create inferior hook. */ static void spu_solib_create_inferior_hook (int from_tty) @@ -435,11 +531,19 @@ spu_solib_loaded (struct so_list *so) solib_read_symbols (so, 0); spu_enable_break (so->objfile); } + /* In case the OpenCL runtime is loaded we install a breakpoint + to get notified whenever an OpenCL program gets loaded. */ + if (strstr (so->so_name, "CLRuntimeAccelCellSPU@") !=3D NULL) + { + solib_read_symbols (so, 0); + ocl_enable_break (so->objfile); + } } =20 void _initialize_spu_solib (void) { observer_attach_solib_loaded (spu_solib_loaded); + ocl_program_data_key =3D register_objfile_data (); } =20 --Boundary-00=_QWLJMl/c5MH7P5b--