; --------------------------------------------------------------------------------
; @Title: Run Mode Autoload Script, called by TRACE32 if symbols are to be loaded
; @Description:
;   Autoloader Script for GDB Run Mode Debugging
;   Enabled with command:
;   sYmbol.AUTOLOAD.CHECKCoMmanD ~~/demo/etc/gdb/gdb_autoload.cmm
; @Author: KJM
; @Copyright: (C) 1989-2014 Lauterbach GmbH, licensed for use with TRACE32(R) only
; --------------------------------------------------------------------------------
; $Id: gdb_autoload.cmm 15725 2020-02-25 17:25:28Z rweiss $ 

// define local macros
 LOCAL &filename &basename &progname &filepath &code &data &space
 LOCAL &symfilename1 &symfilename2

// get filename and relocation information
 // these parameters are passed from TRACE32 when calling this skript
 
 ENTRY &filename &type &code &data &space
 
 //print "autoload: " &filename " " &type " " &code " " &data " " &space
 
 // &filename:      name of process/file
 // &type:          type of file: 1=process, 2=library, 3=kernel module
 // &code:          text segment address
 // &data:          data segment address
 // &space:         space id of process
 
// get symbol file name and program name
 &filepath=""
 IF ((&type&0xffff)==2)
 (
     &basename=&filename
     RePeAT
     (
         &basename=STRing.CUT("&basename",-STRing.LENgth(OS.FILE.EXTENSION(&basename)))
     )
     WHILE OS.FILE.EXTENSION(&basename)!=""
 )
 ELSE
 (
     &basename=STRing.CUT(&filename,-STRing.LENgth(OS.FILE.EXTENSION(&filename)))
 )
 IF (&type==1)
 (
   // processes
   &symfilename1="&basename"        // without extension
   &symfilename2=&filename          // as given in parameter
 )
 IF ((&type&0xffff)==2)
 (
   // libraries
   &symfilename1=&filename
   &symfilename2="&basename"+".so"
 )
 IF (&type==3)
 (
   // kernel modules
   &symfilename1="&basename"+".ko"
   // Linux converts dashes to underlines - try to reverse this
   LOCAL &ul &len
   &symfilename2="&basename"+".ko"
   &len=STRing.LENgth("&symfilename2")
   &ul=STRing.SCAN("&symfilename2","_",0)
   WHILE &ul!=-1
   (
     &symfilename2=STRing.CUT("&symfilename2",&ul-&len)+"-"+STRing.CUT("&symfilename2",&ul+1)
     &ul=STRing.SCAN("&symfilename2","_",0)
   )
 )

// get program name
 &progname=OS.FILE.NAME("&basename")

// set space id to zero if not given
 IF "&space"==""
  &space=0

// delete symbols if they already exist
 IF sYmbol.EXIST("\\&progname")
 (
   // create program path - due to possible special characters
   &progpath="`"+"\\"+"&progname"+"`"
   sYmbol.Delete &progpath
 )
 GROUP.Delete "&progname"

// check if preset file path is valid
 IF !OS.FILE("&filepath")
    &filepath=sYmbol.SEARCHFILE("&symfilename1")
// search file in source search path and open dialog when not there
 IF !OS.FILE("&filepath")
    &filepath=sYmbol.SEARCHFILE("&symfilename2")
 IF !OS.FILE("&filepath")
 (
   LOCAL &file &spath
   &file=OS.FILE.NAME("&symfilename1")
   WinPOS ,,,,,, filebox normal "Searching symbols for &filename"
   DIALOG.File "*&file*"
   ENTRY %LINE &filepath
   IF "&filepath"==""
     ENDDO
   &spath=OS.FILE.PATH("&filepath")
   sYmbol.SourcePATH.Set "&spath"
 )

// load symbol file (options for sourcepath, e.g. /STRIPPART may need to be added when required)

 IF (&type==1)  // processes
 (
   Data.LOAD.Elf "&filepath" &space:0 /NoCODE /NoClear
   GROUP.Create "&progname" &space:0x0--0xffffffff /GREEN
 )
 
 IF (&type==3)  // modules
 (
   Data.LOAD.Elf "&filepath" 0:0 /NoCODE /NoClear /name &progname /reloctype &type
   GROUP.Create "&progname" sYmbol.SECRANGE(\\&progname\.text) /YELLOW
 )
 
 IF ((&type&0xffff)==2) // libraries
 (
   Data.LOAD.Elf "&filepath" &space:&code /NoCODE /NoClear
 )
 
 ENDDO

