Patch title: Release 85 bulk changes
Abstract:
File: /pliant/language/debug/record.pli
Key:
    Removed line
    Added line
# Copyright  Hubert Tonneau  hubert.tonneau@pliant.cx
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License version 2
# as published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# version 2 along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

scope "/pliant/language/" "/pliant/install/"
module "/pliant/install/ring1.pli"


# moved to /pliant/language/optimizer/gcc_base.pli
if false

  type DebuggerInstructionRecord
    field Int code_offset
    field ListingPositions position
    field Int profiler_counter <- 0

  type DebuggerVariableRecord
    field Int stack_offset
    field Str name
    field Link:Type type


public
  type DebuggerInstructionRecords
    field Int count <- 0

function destroy rs
  arg_w DebuggerInstructionRecords rs
  for (var Int i) 0 rs:count-1
    DebuggerInstructionRecord destroy_instance ((addressof:rs translate Int 1) translate DebuggerInstructionRecord i)


function generate_debugging_info gc
  arg_rw GeneratorContext gc
  if pliant_debugging_level_variable=0 or (gc:locals first "gcc compiled function")<>null
    return
  var Pointer:Function fun :> gc function
  var Link:List deb
  if fun:externals<>null and addressof:(entry_type fun:externals)=addressof:List
    deb :> fun:externals map List
  else
    deb :> new List
    if fun:externals<>null
      deb append fun:externals
    fun externals := addressof deb
  if true
    var Str last_position := "" ; var Int count := 0
    var Pointer:Instruction i :> gc first_instruction
    while addressof:i<>null
      if i:position<>last_position
        count := count+1
        last_position := i position
      i :> i next_instruction
    if count>0
      (addressof:DebuggerInstructionRecords map Type) size := Int:size+count*DebuggerInstructionRecord:size
      var Link:DebuggerInstructionRecords rs :> new DebuggerInstructionRecords
      rs count := count
      deb append addressof:rs
      var Str last_position := "" ; var Int index := 0
      var Pointer:Instruction i :> gc first_instruction
      while addressof:i<>null
        if i:position<>last_position
          var Pointer:DebuggerInstructionRecord fi :> ((addressof:rs translate Int 1) translate DebuggerInstructionRecord index) map DebuggerInstructionRecord
          DebuggerInstructionRecord build_instance addressof:fi
          fi code_offset := i order
          fi position := i position
          last_position := i position ; index := index+1
        i :> i next_instruction
  else
    var Str last_position := ""
    var Pointer:Instruction i :> gc first_instruction
    while addressof:i<>null
      if i:position<>last_position
        var Link:DebuggerInstructionRecord fi :> new DebuggerInstructionRecord
        fi code_offset := i order
        fi position := i position
        deb append addressof:fi
        last_position := i position
      i :> i next_instruction
  if pliant_debugging_level_variable>=2
    var Int pushsize := (gc:locals first "pliant push size") map Int
    var Int localsize := (gc:locals first "pliant locals size") map Int
    var Dictionary names
    var Pointer:Arrow c :> gc:arguments first
    while c<>null
      var Pointer:Argument a :> c map Argument
      if a:name:len<>0 and a:where=3
        var Str fullname := a:name+" "+('convert to string' a:offset)
        if (names first fullname)=null
          var Link:DebuggerVariableRecord fv :> new DebuggerVariableRecord
          fv stack_offset := a:offset-pushsize-localsize
          fv name := a name
          if a:pointer:where=2 and a:pointer:register=4
            fv type :> a type
          else
            fv type :> pointerto a:type
          deb append addressof:fv
          names insert fullname true addressof:a
      c :> gc:arguments next c


# sets the optimizer that will generate debugging informations

the_module:"/pliant/language/optimizer/basic.pli" define "pliant optimizer conclude" addressof:(the_function generate_debugging_info GeneratorContext)