# Copyright 2010-2021 Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# 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
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

# Return true if the target supports DWARF-2 and uses gas.
# For now pick a sampling of likely targets.
proc dwarf2_support {} {
    if {[istarget *-*-linux*]
	|| [istarget *-*-gnu*]
	|| [istarget *-*-elf*]
	|| [istarget *-*-openbsd*]
	|| [istarget arm*-*-eabi*]
	|| [istarget powerpc-*-eabi*]} {
	return 1
    }

    return 0
}

# Use 'objcopy --extract-dwo to extract DWO information from
# OBJECT_FILE and place it into DWO_FILE.
#
# Return 0 on success, otherwise, return -1.
proc extract_dwo_information { object_file dwo_file } {
    set objcopy [gdb_find_objcopy]
    set command "$objcopy --extract-dwo $object_file $dwo_file"
    verbose -log "Executing $command"
    set result [catch "exec $command" output]
    verbose -log "objcopy --extract-dwo output: $output"
    if { $result == 1 } {
	return -1
    }
    return 0
}

# Use 'objcopy --strip-dwo to remove DWO information from
# FILENAME.
#
# Return 0 on success, otherwise, return -1.
proc strip_dwo_information { filename } {
    set objcopy [gdb_find_objcopy]
    set command "$objcopy --strip-dwo $filename"
    verbose -log "Executing $command"
    set result [catch "exec $command" output]
    verbose -log "objcopy --strip-dwo output: $output"
    if { $result == 1 } {
	return -1
    }
    return 0
}

# Build an executable, with the debug information split out into a
# separate .dwo file.
#
# This function is based on build_executable_from_specs in
# lib/gdb.exp, but with threading support, and rust support removed.
#
# TESTNAME is the name of the test; this is passed to 'untested' if
# something fails.
#
# EXECUTABLE is the executable to create, this can be an absolute
# path, or a relative path, in which case the EXECUTABLE will be
# created in the standard output directory.
#
# OPTIONS is passed to the final link, using gdb_compile.  If OPTIONS
# contains any option that indicates threads is required, of if the
# option rust is included, then this function will return failure.
#
# ARGS is a series of lists.  Each list is a spec for one source file
# that will be compiled to make EXECUTABLE.  Each spec in ARGS has the
# form:
#	[ SOURCE OPTIONS ]
# or:
#       [ SOURCE OPTIONS OBJFILE ]
#
# Where SOURCE is the path to the source file to compile.  This can be
# absolute, or relative to the standard global ${subdir}/${srcdir}/
# path.
#
# OPTIONS are the options to use when compiling SOURCE into an object
# file.
#
# OBJFILE is optional, if present this is the name of the object file
# to create for SOURCE.  If this is not provided then a suitable name
# will be auto-generated.
#
# If OPTIONS contains the option 'split-dwo' then the debug
# information is extracted from the object file created by compiling
# SOURCE and placed into a file with a dwo extension.  The name of
# this file is generated based on the name of the object file that was
# created (with the .o replaced with .dwo).
proc build_executable_and_dwo_files { testname executable options args } {
    global subdir
    global srcdir

    if { ! [regexp "^/" "$executable"] } then {
	set binfile [standard_output_file $executable]
    } else {
	set binfile $executable
    }

    set info_options ""
    if { [lsearch -exact $options "c++"] >= 0 } {
	set info_options "c++"
    }
    if [get_compiler_info ${info_options}] {
        return -1
    }

    set func gdb_compile
    if {[lsearch -regexp $options \
	     {^(pthreads|shlib|shlib_pthreads|openmp)$}] != -1} {
	# Currently don't support compiling thread based tests here.
	# If this is required then look to build_executable_from_specs
	# for inspiration.
	return -1
    }
    if {[lsearch -exact $options rust] != -1} {
	# Currently don't support compiling rust tests here.  If this
	# is required then look to build_executable_from_specs for
	# inspiration.
	return -1
    }

    # Must be run on local host due to use of objcopy.
    if [is_remote host] {
	return -1
    }

    set objects {}
    set i 0
    foreach spec $args {
	if {[llength $spec] < 2} {
	    error "invalid spec length"
	    return -1
	}

	verbose -log "APB: SPEC: $spec"

	set s [lindex $spec 0]
	set local_options [lindex $spec 1]

	if { ! [regexp "^/" "$s"] } then {
	    set s "$srcdir/$subdir/$s"
	}

	if {[llength $spec] > 2} {
	    set objfile [lindex $spec 2]
	} else {
	    set objfile "${binfile}${i}.o"
	    incr i
	}

	if  { [$func "${s}" "${objfile}" object $local_options] != "" } {
	    untested $testname
	    return -1
	}

	lappend objects "$objfile"

	if {[lsearch -exact $local_options "split-dwo"] >= 0} {
	    # Split out the DWO file.
	    set dwo_file "[file rootname ${objfile}].dwo"

	    if { [extract_dwo_information $objfile $dwo_file] == -1 } {
		untested $testname
		return -1
	    }

	    if { [strip_dwo_information $objfile] == -1 } {
		untested $testname
		return -1
	    }
	}
    }

    verbose -log "APB: OBJECTS = $objects"

    set ret [$func $objects "${binfile}" executable $options]
    if  { $ret != "" } {
        untested $testname
        return -1
    }

    return 0
}

# Return a list of expressions about function FUNC's address and length.
# The first expression is the address of function FUNC, and the second
# one is FUNC's length.  SRC is the source file having function FUNC.
# An internal label ${func}_label must be defined inside FUNC:
#
#  int main (void)
#  {
#    asm ("main_label: .globl main_label");
#    return 0;
#  }
#
# This label is needed to compute the start address of function FUNC.
# If the compiler is gcc, we can do the following to get function start
# and end address too:
#
# asm ("func_start: .globl func_start");
# static void func (void) {}
# asm ("func_end: .globl func_end");
#
# however, this isn't portable, because other compilers, such as clang,
# may not guarantee the order of global asms and function.  The code
# becomes:
#
# asm ("func_start: .globl func_start");
# asm ("func_end: .globl func_end");
# static void func (void) {}
#

proc function_range { func src {options {debug}} } {
    global decimal gdb_prompt

    set exe [standard_temp_file func_addr[pid].x]

    gdb_compile $src $exe executable $options

    gdb_exit
    gdb_start
    gdb_load "$exe"

    # Compute the label offset, and we can get the function start address
    # by "${func}_label - $func_label_offset".
    set func_label_offset ""
    set test "p ${func}_label - ${func}"
    gdb_test_multiple $test $test {
	-re ".* = ($decimal)\r\n$gdb_prompt $" {
	    set func_label_offset $expect_out(1,string)
	}
    }

    # Compute the function length.
    global hex
    set func_length ""
    set test "disassemble $func"
    gdb_test_multiple $test $test {
	-re ".*$hex <\\+($decimal)>:\[^\r\n\]+\r\nEnd of assembler dump\.\r\n$gdb_prompt $" {
	    set func_length $expect_out(1,string)
	}
    }

    # Compute the size of the last instruction.
    if { $func_length == 0 } then {
	set func_pattern "$func"
    } else {
	set func_pattern "$func\\+$func_length"
    }
    set test "x/2i $func+$func_length"
    gdb_test_multiple $test $test {
	-re ".*($hex) <$func_pattern>:\[^\r\n\]+\r\n\[ \]+($hex).*\.\r\n$gdb_prompt $" {
	    set start $expect_out(1,string)
	    set end $expect_out(2,string)

	    set func_length [expr $func_length + $end - $start]
	}
    }

    gdb_exit
    return [list "${func}_label - $func_label_offset" $func_length]
}

# Extract the start, length, and end for function called NAME and
# create suitable variables in the callers scope.
proc get_func_info { name {options {debug}} } {
    global srcdir subdir srcfile

    upvar 1 "${name}_start" func_start
    upvar 1 "${name}_len" func_len
    upvar 1 "${name}_end" func_end

    lassign [function_range ${name} \
		 [list ${srcdir}/${subdir}/$srcfile] \
		 ${options}]  \
	func_start func_len
    set func_end "$func_start + $func_len"
}

# A DWARF assembler.
#
# All the variables in this namespace are private to the
# implementation.  Also, any procedure whose name starts with "_" is
# private as well.  Do not use these.
#
# Exported functions are documented at their definition.
#
# In addition to the hand-written functions documented below, this
# module automatically generates a function for each DWARF tag.  For
# most tags, two forms are made: a full name, and one with the
# "DW_TAG_" prefix stripped.  For example, you can use either
# 'DW_TAG_compile_unit' or 'compile_unit' interchangeably.
#
# There are two exceptions to this rule: DW_TAG_variable and
# DW_TAG_namespace.  For these, the full name must always be used,
# as the short name conflicts with Tcl builtins.  (Should future
# versions of Tcl or DWARF add more conflicts, this list will grow.
# If you want to be safe you should always use the full names.)
#
# Each tag procedure is defined like:
#
# proc DW_TAG_mumble {{attrs {}} {children {}}} { ... }
#
# ATTRS is an optional list of attributes.
# It is run through 'subst' in the caller's context before processing.
#
# Each attribute in the list has one of two forms:
#   1. { NAME VALUE }
#   2. { NAME VALUE FORM }
#
# In each case, NAME is the attribute's name.
# This can either be the full name, like 'DW_AT_name', or a shortened
# name, like 'name'.  These are fully equivalent.
#
# Besides DWARF standard attributes, assembler supports 'macro' attribute
# which will be substituted by one or more standard or macro attributes.
# supported macro attributes are:
#
#  - MACRO_AT_range { FUNC }
#  It is substituted by DW_AT_low_pc and DW_AT_high_pc with the start and
#  end address of function FUNC in file $srcdir/$subdir/$srcfile.
#
#  - MACRO_AT_func { FUNC }
#  It is substituted by DW_AT_name with FUNC and MACRO_AT_range.
#
# If FORM is given, it should name a DW_FORM_ constant.
# This can either be the short form, like 'DW_FORM_addr', or a
# shortened version, like 'addr'.  If the form is given, VALUE
# is its value; see below.  In some cases, additional processing
# is done; for example, DW_FORM_strp manages the .debug_str
# section automatically.
#
# If FORM is 'SPECIAL_expr', then VALUE is treated as a location
# expression.  The effective form is then DW_FORM_block or DW_FORM_exprloc
# for DWARF version >= 4, and VALUE is passed to the (internal)
# '_location' proc to be translated.
# This proc implements a miniature DW_OP_ assembler.
#
# If FORM is not given, it is guessed:
# * If VALUE starts with the "@" character, the rest of VALUE is
#   looked up as a DWARF constant, and DW_FORM_sdata is used.  For
#   example, '@DW_LANG_c89' could be used.
# * If VALUE starts with the ":" character, then it is a label
#   reference.  The rest of VALUE is taken to be the name of a label,
#   and DW_FORM_ref4 is used.  See 'new_label' and 'define_label'.
# * If VALUE starts with the "%" character, then it is a label
#   reference too, but DW_FORM_ref_addr is used.
# * Otherwise, if the attribute name has a default form (f.i. DW_FORM_addr for
#   DW_AT_low_pc), then that one is used.
# * Otherwise, an error is reported.  Either specify a form explicitly, or
#   add a default for the the attribute name in _default_form.
#
# CHILDREN is just Tcl code that can be used to define child DIEs.  It
# is evaluated in the caller's context.
#
# Currently this code is missing nice support for CFA handling, and
# probably other things as well.

namespace eval Dwarf {
    # True if the module has been initialized.
    variable _initialized 0

    # Constants from dwarf2.h.
    variable _constants
    # DW_AT short names.
    variable _AT
    # DW_FORM short names.
    variable _FORM
    # DW_OP short names.
    variable _OP

    # The current output file.
    variable _output_file

    # Note: The _cu_ values here also apply to type units (TUs).
    # Think of a TU as a special kind of CU.

    # Current CU count.
    variable _cu_count

    # The current CU's base label.
    variable _cu_label

    # The current CU's version.
    variable _cu_version

    # The current CU's address size.
    variable _cu_addr_size
    # The current CU's offset size.
    variable _cu_offset_size

    # Label generation number.
    variable _label_num

    # The deferred output array.  The index is the section name; the
    # contents hold the data for that section.
    variable _deferred_output

    # If empty, we should write directly to the output file.
    # Otherwise, this is the name of a section to write to.
    variable _defer

    # The abbrev section.  Typically .debug_abbrev but can be .debug_abbrev.dwo
    # for Fission.
    variable _abbrev_section

    # The next available abbrev number in the current CU's abbrev
    # table.
    variable _abbrev_num

    # The string table for this assembly.  The key is the string; the
    # value is the label for that string.
    variable _strings

    # Current .debug_line unit count.
    variable _line_count

    # Whether a file_name entry was seen.
    variable _line_saw_file

    # Whether a line table program has been seen.
    variable _line_saw_program

    # A Label for line table header generation.
    variable _line_header_end_label

    # The address size for debug ranges section.
    variable _debug_ranges_64_bit

    # The index into the .debug_addr section (used for fission
    # generation).
    variable _debug_addr_index

    # Flag, true if the current CU is contains fission information,
    # otherwise false.
    variable _cu_is_fission

    proc _process_one_constant {name value} {
	variable _constants
	variable _AT
	variable _FORM
	variable _OP

	set _constants($name) $value

	if {![regexp "^DW_(\[A-Z\]+)_(\[A-Za-z0-9_\]+)$" $name \
		  ignore prefix name2]} {
	    error "non-matching name: $name"
	}

	if {$name2 == "lo_user" || $name2 == "hi_user"} {
	    return
	}

	# We only try to shorten some very common things.
	# FIXME: CFA?
	switch -exact -- $prefix {
	    TAG {
		# Create two procedures for the tag.  These call
		# _handle_DW_TAG with the full tag name baked in; this
		# does all the actual work.
		proc $name {{attrs {}} {children {}}} \
		    "_handle_DW_TAG $name \$attrs \$children"

		# Filter out ones that are known to clash.
		if {$name2 == "variable" || $name2 == "namespace"} {
		    set name2 "tag_$name2"
		}

		if {[info commands $name2] != {}} {
		    error "duplicate proc name: from $name"
		}

		proc $name2 {{attrs {}} {children {}}} \
		    "_handle_DW_TAG $name \$attrs \$children"
	    }

	    AT {
		set _AT($name2) $name
	    }

	    FORM {
		set _FORM($name2) $name
	    }

	    OP {
		set _OP($name2) $name
	    }

	    default {
		return
	    }
	}
    }

    proc _read_constants {} {
	global srcdir hex decimal

	# DWARF name-matching regexp.
	set dwrx "DW_\[a-zA-Z0-9_\]+"
	# Whitespace regexp.
	set ws "\[ \t\]+"

	set fd [open [file join $srcdir .. .. include dwarf2.h]]
	while {![eof $fd]} {
	    set line [gets $fd]
	    if {[regexp -- "^${ws}($dwrx)${ws}=${ws}($hex|$decimal),?$" \
		     $line ignore name value ignore2]} {
		_process_one_constant $name $value
	    }
	}
	close $fd

	set fd [open [file join $srcdir .. .. include dwarf2.def]]
	while {![eof $fd]} {
	    set line [gets $fd]
	    if {[regexp -- \
		     "^DW_\[A-Z_\]+${ws}\\(($dwrx),${ws}($hex|$decimal)\\)$" \
		     $line ignore name value ignore2]} {
		_process_one_constant $name $value
	    }
	}
	close $fd
    }

    proc _quote {string} {
	# FIXME
	return "\"${string}\\0\""
    }

    proc _nz_quote {string} {
	# For now, no quoting is done.
	return "\"${string}\""
    }

    proc _handle_DW_FORM {form value} {
	switch -exact -- $form {
	    DW_FORM_string  {
		_op .ascii [_quote $value]
	    }

	    DW_FORM_flag_present {
		# We don't need to emit anything.
	    }

	    DW_FORM_data4 -
	    DW_FORM_ref4 {
		_op .4byte $value
	    }

	    DW_FORM_ref_addr {
		variable _cu_offset_size
		variable _cu_version
		variable _cu_addr_size

		if {$_cu_version == 2} {
		    set size $_cu_addr_size
		} else {
		    set size $_cu_offset_size
		}

		_op .${size}byte $value
	    }

	    DW_FORM_GNU_ref_alt -
	    DW_FORM_GNU_strp_alt -
	    DW_FORM_sec_offset {
		variable _cu_offset_size
		_op .${_cu_offset_size}byte $value
	    }

	    DW_FORM_ref1 -
	    DW_FORM_flag -
	    DW_FORM_data1 {
		_op .byte $value
	    }

	    DW_FORM_sdata {
		_op .sleb128 $value
	    }

	    DW_FORM_ref_udata -
	    DW_FORM_udata -
	    DW_FORM_loclistx -
	    DW_FORM_rnglistx {
		_op .uleb128 $value
	    }

	    DW_FORM_addr {
		variable _cu_addr_size

		_op .${_cu_addr_size}byte $value
	    }

	    DW_FORM_GNU_addr_index {
		variable _debug_addr_index
		variable _cu_addr_size

		_op .uleb128 ${_debug_addr_index}
		incr _debug_addr_index

		_defer_output .debug_addr {
		    _op .${_cu_addr_size}byte $value
		}
	    }

	    DW_FORM_data2 -
	    DW_FORM_ref2 {
		_op .2byte $value
	    }

	    DW_FORM_data8 -
	    DW_FORM_ref8 -
	    DW_FORM_ref_sig8 {
		_op .8byte $value
	    }

	    DW_FORM_data16 {
		_op .8byte $value
	    }

	    DW_FORM_strp {
		variable _strings
		variable _cu_offset_size

		if {![info exists _strings($value)]} {
		    set _strings($value) [new_label strp]
		    _defer_output .debug_str {
			define_label $_strings($value)
			_op .ascii [_quote $value]
		    }
		}

		_op .${_cu_offset_size}byte $_strings($value) "strp: $value"
	    }

	    SPECIAL_expr {
		variable _cu_version
		variable _cu_addr_size
		variable _cu_offset_size

		set l1 [new_label "expr_start"]
		set l2 [new_label "expr_end"]
		_op .uleb128 "$l2 - $l1" "expression"
		define_label $l1
		_location $value $_cu_version $_cu_addr_size $_cu_offset_size
		define_label $l2
	    }

	    DW_FORM_block1 {
		set len [string length $value]
		if {$len > 255} {
		    error "DW_FORM_block1 length too long"
		}
		_op .byte $len
		_op .ascii [_nz_quote $value]
	    }

	    DW_FORM_block2 -
	    DW_FORM_block4 -

	    DW_FORM_block -

	    DW_FORM_ref2 -
	    DW_FORM_indirect -
	    DW_FORM_exprloc -

	    DW_FORM_strx -
	    DW_FORM_strx1 -
	    DW_FORM_strx2 -
	    DW_FORM_strx3 -
	    DW_FORM_strx4 -

	    DW_FORM_GNU_str_index -

	    default {
		error "unhandled form $form"
	    }
	}
    }

    proc _guess_form {value varname} {
	upvar $varname new_value

	switch -exact -- [string range $value 0 0] {
	    @ {
		# Constant reference.
		variable _constants

		set new_value $_constants([string range $value 1 end])
		# Just the simplest.
		return DW_FORM_sdata
	    }

	    : {
		# Label reference.
		variable _cu_label

		set new_value "[string range $value 1 end] - $_cu_label"

		return DW_FORM_ref4
	    }

	    % {
		# Label reference, an offset from .debug_info.
		set new_value "[string range $value 1 end]"

		return DW_FORM_ref_addr
	    }

	    default {
		return ""
	    }
	}
    }

    proc _default_form { attr } {
	switch -exact -- $attr {
	    DW_AT_low_pc  {
		return DW_FORM_addr
	    }
	    DW_AT_producer -
	    DW_AT_comp_dir -
	    DW_AT_linkage_name -
	    DW_AT_MIPS_linkage_name -
	    DW_AT_name {
		return DW_FORM_string
	    }
	    DW_AT_GNU_addr_base {
		return DW_FORM_sec_offset
	    }
	}
	return ""
    }

    # Map NAME to its canonical form.
    proc _map_name {name ary} {
	variable $ary

	if {[info exists ${ary}($name)]} {
	    set name [set ${ary}($name)]
	}

	return $name
    }

    proc _handle_attribute { attr_name attr_value attr_form } {
	variable _abbrev_section
	variable _constants
	variable _cu_version

	_handle_DW_FORM $attr_form $attr_value

	_defer_output $_abbrev_section {
	    if { $attr_form eq "SPECIAL_expr" } {
		if { $_cu_version < 4 } {
		    set attr_form_comment "DW_FORM_block"
		} else {
		    set attr_form_comment "DW_FORM_exprloc"
		}
	    } else {
		set attr_form_comment $attr_form
	    }
	    _op .uleb128 $_constants($attr_name) $attr_name
	    _op .uleb128 $_constants($attr_form) $attr_form_comment
	}
    }

    # Handle macro attribute MACRO_AT_range.

    proc _handle_macro_at_range { attr_value } {
	variable _cu_is_fission

	if {[llength $attr_value] != 1} {
	    error "usage: MACRO_AT_range { func }"
	}

	set func [lindex $attr_value 0]
	global srcdir subdir srcfile
	set src ${srcdir}/${subdir}/${srcfile}
	set result [function_range $func $src]

	set form DW_FORM_addr
	if { $_cu_is_fission } {
	    set form DW_FORM_GNU_addr_index
	}

	_handle_attribute DW_AT_low_pc [lindex $result 0] $form
	_handle_attribute DW_AT_high_pc \
	    "[lindex $result 0] + [lindex $result 1]" $form
    }

    # Handle macro attribute MACRO_AT_func.

    proc _handle_macro_at_func { attr_value } {
	if {[llength $attr_value] != 1} {
	    error "usage: MACRO_AT_func { func file }"
	}
	_handle_attribute DW_AT_name [lindex $attr_value 0] DW_FORM_string
	_handle_macro_at_range $attr_value
    }

    proc _handle_DW_TAG {tag_name {attrs {}} {children {}}} {
	variable _abbrev_section
	variable _abbrev_num
	variable _constants

	set has_children [expr {[string length $children] > 0}]
	set my_abbrev [incr _abbrev_num]

	# We somewhat wastefully emit a new abbrev entry for each tag.
	# There's no reason for this other than laziness.
	_defer_output $_abbrev_section {
	    _op .uleb128 $my_abbrev "Abbrev start"
	    _op .uleb128 $_constants($tag_name) $tag_name
	    _op .byte $has_children "has_children"
	}

	_op .uleb128 $my_abbrev "Abbrev ($tag_name)"

	foreach attr $attrs {
	    set attr_name [_map_name [lindex $attr 0] _AT]

	    # When the length of ATTR is greater than 2, the last
	    # element of the list must be a form.  The second through
	    # the penultimate elements are joined together and
	    # evaluated using subst.  This allows constructs such as
	    # [gdb_target_symbol foo] to be used.

	    if {[llength $attr] > 2} {
	        set attr_value [uplevel 2 [list subst [join [lrange $attr 1 end-1]]]]
	    } else {
	        set attr_value [uplevel 2 [list subst [lindex $attr 1]]]
	    }

	    if { [string equal "MACRO_AT_func" $attr_name] } {
		_handle_macro_at_func $attr_value
	    } elseif { [string equal "MACRO_AT_range" $attr_name] } {
		_handle_macro_at_range $attr_value
	    } else {
		if {[llength $attr] > 2} {
		    set attr_form [uplevel 2 [list subst [lindex $attr end]]]

		    if { [string index $attr_value 0] == ":" } {
			# It is a label, get its value.
			_guess_form $attr_value attr_value
		    }
		} else {
		    set attr_form [_guess_form $attr_value attr_value]
		    if { $attr_form eq "" } {
			set attr_form [_default_form $attr_name]
		    }
		    if { $attr_form eq "" } {
			error "No form for $attr_name $attr_value"
		    }
		}
		set attr_form [_map_name $attr_form _FORM]

		_handle_attribute $attr_name $attr_value $attr_form
	    }
	}

	_defer_output $_abbrev_section {
	    # Terminator.
	    _op .byte 0x0 "DW_AT - Terminator"
	    _op .byte 0x0 "DW_FORM - Terminator"
	}

	if {$has_children} {
	    uplevel 2 $children

	    # Terminate children.
	    _op .byte 0x0 "Terminate children"
	}
    }

    proc _emit {string} {
	variable _output_file
	variable _defer
	variable _deferred_output

	if {$_defer == ""} {
	    puts $_output_file $string
	} else {
	    append _deferred_output($_defer) ${string}\n
	}
    }

    proc _section {name {flags ""} {type ""}} {
	if {$flags == "" && $type == ""} {
	    _emit "        .section $name"
	} elseif {$type == ""} {
	    _emit "        .section $name, \"$flags\""
	} else {
	    _emit "        .section $name, \"$flags\", %$type"
	}
    }

    # SECTION_SPEC is a list of arguments to _section.
    proc _defer_output {section_spec body} {
	variable _defer
	variable _deferred_output

	set old_defer $_defer
	set _defer [lindex $section_spec 0]

	if {![info exists _deferred_output($_defer)]} {
	    set _deferred_output($_defer) ""
	    eval _section $section_spec
	}

	uplevel $body

	set _defer $old_defer
    }

    proc _defer_to_string {body} {
	variable _defer
	variable _deferred_output

	set old_defer $_defer
	set _defer temp

	set _deferred_output($_defer) ""

	uplevel $body

	set result $_deferred_output($_defer)
	unset _deferred_output($_defer)

	set _defer $old_defer
	return $result
    }

    proc _write_deferred_output {} {
	variable _output_file
	variable _deferred_output

	foreach section [array names _deferred_output] {
	    # The data already has a newline.
	    puts -nonewline $_output_file $_deferred_output($section)
	}

	# Save some memory.
	unset _deferred_output
    }

    proc _op {name value {comment ""}} {
	set text "        ${name}        ${value}"
	if {$comment != ""} {
	    # Try to make stuff line up nicely.
	    while {[string length $text] < 40} {
		append text " "
	    }
	    append text "/* ${comment} */"
	}
	_emit $text
    }

    proc _compute_label {name} {
	return ".L${name}"
    }

    # Return a name suitable for use as a label.  If BASE_NAME is
    # specified, it is incorporated into the label name; this is to
    # make debugging the generated assembler easier.  If BASE_NAME is
    # not specified a generic default is used.  This proc does not
    # define the label; see 'define_label'.  'new_label' attempts to
    # ensure that label names are unique.
    proc new_label {{base_name label}} {
	variable _label_num

	return [_compute_label ${base_name}[incr _label_num]]
    }

    # Define a label named NAME.  Ordinarily, NAME comes from a call
    # to 'new_label', but this is not required.
    proc define_label {name} {
	_emit "${name}:"
    }

    # A higher-level interface to label handling.
    #
    # ARGS is a list of label descriptors.  Each one is either a
    # single element, or a list of two elements -- a name and some
    # text.  For each descriptor, 'new_label' is invoked.  If the list
    # form is used, the second element in the list is passed as an
    # argument.  The label name is used to define a variable in the
    # enclosing scope; this can be used to refer to the label later.
    # The label name is also used to define a new proc whose name is
    # the label name plus a trailing ":".  This proc takes a body as
    # an argument and can be used to define the label at that point;
    # then the body, if any, is evaluated in the caller's context.
    #
    # For example:
    #
    # declare_labels int_label
    # something { ... $int_label }   ;# refer to the label
    # int_label: constant { ... }    ;# define the label
    proc declare_labels {args} {
	foreach arg $args {
	    set name [lindex $arg 0]
	    set text [lindex $arg 1]

	    if { $text == "" } {
		set text $name
	    }

	    upvar $name label_var
	    set label_var [new_label $text]

	    proc ${name}: {args} [format {
		define_label %s
		uplevel $args
	    } $label_var]
	}
    }

    # Assign elements from LINE to the elements of an array named
    # "argvec" in the caller scope.  The keys used are named in ARGS.
    # If the wrong number of elements appear in LINE, error.
    proc _get_args {line op args} {
	if {[llength $line] != [llength $args] + 1} {
	    error "usage: $op [string toupper $args]"
	}

	upvar argvec argvec
	foreach var $args value [lreplace $line 0 0] {
	    set argvec($var) $value
	}
    }

    # This is a miniature assembler for location expressions.  It is
    # suitable for use in the attributes to a DIE.  Its output is
    # prefixed with "=" to make it automatically use DW_FORM_block.
    #
    # BODY is split by lines, and each line is taken to be a list.
    #
    # DWARF_VERSION is the DWARF version for the section where the location
    # description is found.
    #
    # ADDR_SIZE is the length in bytes (4 or 8) of an address on the target
    # machine (typically found in the header of the section where the location
    # description is found).
    #
    # OFFSET_SIZE is the length in bytes (4 or 8) of an offset into a DWARF
    # section.  This typically depends on whether 32-bit or 64-bit DWARF is
    # used, as indicated in the header of the section where the location
    # description is found.
    #
    # (FIXME should use 'info complete' here.)
    # Each list's first element is the opcode, either short or long
    # forms are accepted.
    # FIXME argument handling
    # FIXME move docs
    proc _location { body dwarf_version addr_size offset_size } {
	variable _constants

	foreach line [split $body \n] {
	    # Ignore blank lines, and allow embedded comments.
	    if {[lindex $line 0] == "" || [regexp -- {^[ \t]*#} $line]} {
		continue
	    }
	    set opcode [_map_name [lindex $line 0] _OP]
	    _op .byte $_constants($opcode) $opcode

	    array unset argvec *
	    switch -exact -- $opcode {
		DW_OP_addr {
		    _get_args $line $opcode size
		    _op .${addr_size}byte $argvec(size)
		}

		DW_OP_GNU_addr_index {
		    variable _debug_addr_index
		    variable _cu_addr_size

		    _op .uleb128 ${_debug_addr_index}
		    incr _debug_addr_index

		    _defer_output .debug_addr {
			_op .${_cu_addr_size}byte [lindex $line 1]
		    }
		}

		DW_OP_regx {
		    _get_args $line $opcode register
		    _op .uleb128 $argvec(register)
		}

		DW_OP_pick -
		DW_OP_const1u -
		DW_OP_const1s {
		    _get_args $line $opcode const
		    _op .byte $argvec(const)
		}

		DW_OP_const2u -
		DW_OP_const2s {
		    _get_args $line $opcode const
		    _op .2byte $argvec(const)
		}

		DW_OP_const4u -
		DW_OP_const4s {
		    _get_args $line $opcode const
		    _op .4byte $argvec(const)
		}

		DW_OP_const8u -
		DW_OP_const8s {
		    _get_args $line $opcode const
		    _op .8byte $argvec(const)
		}

		DW_OP_constu {
		    _get_args $line $opcode const
		    _op .uleb128 $argvec(const)
		}
		DW_OP_consts {
		    _get_args $line $opcode const
		    _op .sleb128 $argvec(const)
		}

		DW_OP_plus_uconst {
		    _get_args $line $opcode const
		    _op .uleb128 $argvec(const)
		}

		DW_OP_piece {
		    _get_args $line $opcode size
		    _op .uleb128 $argvec(size)
		}

		DW_OP_bit_piece {
		    _get_args $line $opcode size offset
		    _op .uleb128 $argvec(size)
		    _op .uleb128 $argvec(offset)
		}

		DW_OP_skip -
		DW_OP_bra {
		    _get_args $line $opcode label
		    _op .2byte $argvec(label)
		}

		DW_OP_implicit_value {
		    set l1 [new_label "value_start"]
		    set l2 [new_label "value_end"]
		    _op .uleb128 "$l2 - $l1"
		    define_label $l1
		    foreach value [lrange $line 1 end] {
			switch -regexp -- $value {
			    {^0x[[:xdigit:]]{1,2}$} {_op .byte $value}
			    {^0x[[:xdigit:]]{4}$} {_op .2byte $value}
			    {^0x[[:xdigit:]]{8}$} {_op .4byte $value}
			    {^0x[[:xdigit:]]{16}$} {_op .8byte $value}
			    default {
				error "bad value '$value' in DW_OP_implicit_value"
			    }
			}
		    }
		    define_label $l2
		}

		DW_OP_implicit_pointer -
		DW_OP_GNU_implicit_pointer {
		    _get_args $line $opcode label offset

		    # Here label is a section offset.
		    if { $dwarf_version == 2 } {
			_op .${addr_size}byte $argvec(label)
		    } else {
			_op .${offset_size}byte $argvec(label)
		    }
		    _op .sleb128 $argvec(offset)
		}

		DW_OP_GNU_variable_value {
		    _get_args $line $opcode label

		    # Here label is a section offset.
		    if { $dwarf_version == 2 } {
			_op .${addr_size}byte $argvec(label)
		    } else {
			_op .${offset_size}byte $argvec(label)
		    }
		}

		DW_OP_deref_size {
		    _get_args $line $opcode size
		    _op .byte $argvec(size)
		}

		DW_OP_bregx {
		    _get_args $line $opcode register offset
		    _op .uleb128 $argvec(register)
		    _op .sleb128 $argvec(offset)
		}

		DW_OP_fbreg {
		    _get_args $line $opcode offset
		    _op .sleb128 $argvec(offset)
		}

		DW_OP_fbreg {
		    _op .sleb128 [lindex $line 1]
		}

		DW_OP_LLVM_offset_constu {
		    _op .uleb128 [lindex $line 1]
		}

		DW_OP_LLVM_extend {
		    _op .uleb128 [lindex $line 1]
		    _op .uleb128 [lindex $line 2]
		}

		DW_OP_LLVM_select_bit_piece {
		    _op .uleb128 [lindex $line 1]
		    _op .uleb128 [lindex $line 2]
		}

		default {
		    if {[llength $line] > 1} {
			error "Unimplemented: operands in location for $opcode"
		    }
		}
	    }
	}
    }

    # Return a label that references the current position in the
    # .debug_addr table.  When a user is creating split DWARF they
    # will define two CUs, the first will be the split DWARF content,
    # and the second will be the non-split stub CU.  The split DWARF
    # CU fills in the .debug_addr section, but the non-split CU
    # includes a reference to the start of the section.  The label
    # returned by this proc provides that reference.
    proc debug_addr_label {} {
	variable _debug_addr_index

	set lbl [new_label "debug_addr_idx_${_debug_addr_index}_"]
	_defer_output .debug_addr {
	    define_label $lbl
	}
	return $lbl
    }

    # Emit a DWARF CU.
    # OPTIONS is a list with an even number of elements containing
    # option-name and option-value pairs.
    # Current options are:
    # is_64 0|1    - boolean indicating if you want to emit 64-bit DWARF
    #                default = 0 (32-bit)
    # version n    - DWARF version number to emit
    #                default = 4
    # addr_size n  - the size of addresses in bytes: 4, 8, or default
    #                default = default
    # fission 0|1  - boolean indicating if generating Fission debug info
    #                default = 0
    # label <label>
    #              - string indicating label to be defined at the start
    #                of the CU header.
    #                default = ""
    # BODY is Tcl code that emits the DIEs which make up the body of
    # the CU.  It is evaluated in the caller's context.
    proc cu {options body} {
	variable _constants
	variable _cu_count
	variable _abbrev_section
	variable _abbrev_num
	variable _cu_label
	variable _cu_version
	variable _cu_addr_size
	variable _cu_offset_size
	variable _cu_is_fission

	# Establish the defaults.
	set is_64 0
	set _cu_version 4
	set _cu_addr_size default
	set _cu_is_fission 0
	set section ".debug_info"
	set _abbrev_section ".debug_abbrev"
	set label ""

	foreach { name value } $options {
	    set value [uplevel 1 "subst \"$value\""]
	    switch -exact -- $name {
		is_64 { set is_64 $value }
		version { set _cu_version $value }
		addr_size { set _cu_addr_size $value }
		fission { set _cu_is_fission $value }
		label { set label $value }
		default { error "unknown option $name" }
	    }
	}
	if {$_cu_addr_size == "default"} {
	    if {[is_64_target]} {
		set _cu_addr_size 8
	    } else {
		set _cu_addr_size 4
	    }
	}
	set _cu_offset_size [expr { $is_64 ? 8 : 4 }]
	if { $_cu_is_fission } {
	    set section ".debug_info.dwo"
	    set _abbrev_section ".debug_abbrev.dwo"
	}

	if {$_cu_version < 4} {
	    set _constants(SPECIAL_expr) $_constants(DW_FORM_block)
	} else {
	    set _constants(SPECIAL_expr) $_constants(DW_FORM_exprloc)
	}

	_section $section

	set cu_num [incr _cu_count]
	set my_abbrevs [_compute_label "abbrev${cu_num}_begin"]
	set _abbrev_num 1

	set _cu_label [_compute_label "cu${cu_num}_begin"]
	set start_label [_compute_label "cu${cu_num}_start"]
	set end_label [_compute_label "cu${cu_num}_end"]

	if { $label != "" } {
	    upvar $label my_label
	    set my_label $_cu_label
	}

	define_label $_cu_label
	if {$is_64} {
	    _op .4byte 0xffffffff
	    _op .8byte "$end_label - $start_label"
	} else {
	    _op .4byte "$end_label - $start_label"
	}
	define_label $start_label
	_op .2byte $_cu_version Version

	# The CU header for DWARF 4 and 5 are slightly different.
	if { $_cu_version == 5 } {
	    _op .byte 0x1 "DW_UT_compile"
	    _op .byte $_cu_addr_size "Pointer size"
	    _op .${_cu_offset_size}byte $my_abbrevs Abbrevs
	} else {
	    _op .${_cu_offset_size}byte $my_abbrevs Abbrevs
	    _op .byte $_cu_addr_size "Pointer size"
	}

	_defer_output $_abbrev_section {
	    define_label $my_abbrevs
	}

	uplevel $body

	_defer_output $_abbrev_section {
	    # Emit the terminator.
	    _op .byte 0x0 "Abbrev end - Terminator"
	}

	define_label $end_label
    }

    # Emit a DWARF TU.
    # OPTIONS is a list with an even number of elements containing
    # option-name and option-value pairs.
    # Current options are:
    # is_64 0|1    - boolean indicating if you want to emit 64-bit DWARF
    #                default = 0 (32-bit)
    # version n    - DWARF version number to emit
    #                default = 4
    # addr_size n  - the size of addresses in bytes: 4, 8, or default
    #                default = default
    # fission 0|1  - boolean indicating if generating Fission debug info
    #                default = 0
    # SIGNATURE is the 64-bit signature of the type.
    # TYPE_LABEL is the label of the type defined by this TU,
    # or "" if there is no type (i.e., type stubs in Fission).
    # BODY is Tcl code that emits the DIEs which make up the body of
    # the TU.  It is evaluated in the caller's context.
    proc tu {options signature type_label body} {
	variable _cu_count
	variable _abbrev_section
	variable _abbrev_num
	variable _cu_label
	variable _cu_version
	variable _cu_addr_size
	variable _cu_offset_size
	variable _cu_is_fission

	# Establish the defaults.
	set is_64 0
	set _cu_version 4
	set _cu_addr_size default
	set _cu_is_fission 0
	set section ".debug_types"
	set _abbrev_section ".debug_abbrev"

	foreach { name value } $options {
	    switch -exact -- $name {
		is_64 { set is_64 $value }
		version { set _cu_version $value }
		addr_size { set _cu_addr_size $value }
		fission { set _cu_is_fission $value }
		default { error "unknown option $name" }
	    }
	}
	if {$_cu_addr_size == "default"} {
	    if {[is_64_target]} {
		set _cu_addr_size 8
	    } else {
		set _cu_addr_size 4
	    }
	}
	set _cu_offset_size [expr { $is_64 ? 8 : 4 }]
	if { $_cu_is_fission } {
	    set section ".debug_types.dwo"
	    set _abbrev_section ".debug_abbrev.dwo"
	}

	_section $section

	set cu_num [incr _cu_count]
	set my_abbrevs [_compute_label "abbrev${cu_num}_begin"]
	set _abbrev_num 1

	set _cu_label [_compute_label "cu${cu_num}_begin"]
	set start_label [_compute_label "cu${cu_num}_start"]
	set end_label [_compute_label "cu${cu_num}_end"]

	define_label $_cu_label
	if {$is_64} {
	    _op .4byte 0xffffffff
	    _op .8byte "$end_label - $start_label"
	} else {
	    _op .4byte "$end_label - $start_label"
	}
	define_label $start_label
	_op .2byte $_cu_version Version
	_op .${_cu_offset_size}byte $my_abbrevs Abbrevs
	_op .byte $_cu_addr_size "Pointer size"
	_op .8byte $signature Signature
	if { $type_label != "" } {
	    uplevel declare_labels $type_label
	    upvar $type_label my_type_label
	    if {$is_64} {
		_op .8byte "$my_type_label - $_cu_label"
	    } else {
		_op .4byte "$my_type_label - $_cu_label"
	    }
	} else {
	    if {$is_64} {
		_op .8byte 0
	    } else {
		_op .4byte 0
	    }
	}

	_defer_output $_abbrev_section {
	    define_label $my_abbrevs
	}

	uplevel $body

	_defer_output $_abbrev_section {
	    # Emit the terminator.
	    _op .byte 0x0 "Abbrev end - Terminator"
	}

	define_label $end_label
    }

    # Emit a DWARF .debug_ranges unit.
    # OPTIONS is a list with an even number of elements containing
    # option-name and option-value pairs.
    # Current options are:
    # is_64 0|1    - boolean indicating if you want to emit 64-bit DWARF
    #                default = 0 (32-bit)
    #
    # BODY is Tcl code that emits the content of the .debug_ranges
    # unit, it is evaluated in the caller's context.
    proc ranges {options body} {
	variable _debug_ranges_64_bit

	foreach { name value } $options {
	    switch -exact -- $name {
		is_64 { set _debug_ranges_64_bit [subst $value] }
		default { error "unknown option $name" }
	    }
	}

	set section ".debug_ranges"
	_section $section

	proc sequence { body } {
	    variable _debug_ranges_64_bit

	    # Emit the sequence of addresses.

	    proc base { addr } {
		variable _debug_ranges_64_bit

		if { $_debug_ranges_64_bit } then {
		    _op .8byte 0xffffffffffffffff "Base Marker"
		    _op .8byte $addr "Base Address"
		} else {
		    _op .4byte 0xffffffff "Base Marker"
		    _op .4byte $addr "Base Address"
		}
	    }

	    proc range { start end } {
		variable _debug_ranges_64_bit

		if { $_debug_ranges_64_bit } then {
		    _op .8byte $start "Start Address"
		    _op .8byte $end "End Address"
		} else {
		    _op .4byte $start "Start Address"
		    _op .4byte $end "End Address"
		}
	    }

	    uplevel $body

	    # End of the sequence.
	    if { $_debug_ranges_64_bit } then {
		_op .8byte 0x0 "End of Sequence Marker (Part 1)"
		_op .8byte 0x0 "End of Sequence Marker (Part 2)"
	    } else {
		_op .4byte 0x0 "End of Sequence Marker (Part 1)"
		_op .4byte 0x0 "End of Sequence Marker (Part 2)"
	    }
	}

	uplevel $body
    }

    # Emit a DWARF .debug_rnglists section.
    #
    # The target address size is based on the current target's address size.
    #
    # BODY must be Tcl code that emits the content of the section.  It is
    # evaluated in the caller's context.
    #
    # The `is-64 true|false` options tells whether to use 64-bit DWARF instead
    # of 32-bit DWARF.  The default is 32-bit.

    proc rnglists { options body } {
	variable _debug_rnglists_addr_size
	variable _debug_rnglists_offset_size
	variable _debug_rnglists_is_64_dwarf

	parse_options {{"is-64" "false"}}

	if [is_64_target] {
	    set _debug_rnglists_addr_size 8
	} else {
	    set _debug_rnglists_addr_size 4
	}

	if { ${is-64} } {
	    set _debug_rnglists_offset_size 8
	    set _debug_rnglists_is_64_dwarf true
	} else {
	    set _debug_rnglists_offset_size 4
	    set _debug_rnglists_is_64_dwarf false
	}

	_section ".debug_rnglists"

	# Count of tables in the section.
	variable _debug_rnglists_table_count 0

	# Compute the label name for list at index LIST_IDX, for the current
	# table.

	proc _compute_list_label { list_idx } {
	    variable _debug_rnglists_table_count

	    return ".Lrnglists_table_${_debug_rnglists_table_count}_list_${list_idx}"
	}

	with_override Dwarf::table Dwarf::_rnglists_table {
	    uplevel $body
	}
    }

    # Generate one rnglists table (header + offset array + range lists).
    #
    # This proc is meant to be used within proc rnglists' body.  It is made
    # available as `table` while inside proc rnglists' body.
    #
    # BODY must be Tcl code that emits the content of the table.  It may call
    # the LIST_ procedure to generate rnglists.  It is evaluated in the
    # caller's context.
    #
    # The `post-header-label` option can be used to define a label just after
    # the header of the table.  This is the label that a DW_AT_rnglists_base
    # attribute will usually refer to.
    #
    # The `with-offset-array true|false` option can be used to control whether
    # the headers of the location list tables have an array of offset.  The
    # default is true.

    proc _rnglists_table { options body } {
	variable _debug_rnglists_table_count
	variable _debug_rnglists_addr_size
	variable _debug_rnglists_offset_size
	variable _debug_rnglists_is_64_dwarf

	parse_options {
	    {post-header-label ""}
	    {with-offset-array true}
	}

	# Count of lists in the table.
	variable _debug_rnglists_list_count 0

	# Generate the lists ops first, because we need to know how many
	# lists there are to generate the header and offset table.
	set lists_ops [_defer_to_string {
	    with_override Dwarf::list_ Dwarf::_rnglists_list {
		uplevel $body
	    }
	}]

	set post_unit_len_label \
	    [_compute_label "rnglists_table_${_debug_rnglists_table_count}_post_unit_len"]
	set post_header_label \
	    [_compute_label "rnglists_table_${_debug_rnglists_table_count}_post_header"]
	set table_end_label \
	    [_compute_label "rnglists_table_${_debug_rnglists_table_count}_end"]

	# Emit the table header.
	if { $_debug_rnglists_is_64_dwarf } {
	    _op .4byte 0xffffffff "unit length 1/2"
	    _op .8byte "$table_end_label - $post_unit_len_label" "unit length 2/2"
	} else {
	    _op .4byte "$table_end_label - $post_unit_len_label" "unit length"
	}

	define_label $post_unit_len_label

	_op .2byte 5 "dwarf version"
	_op .byte $_debug_rnglists_addr_size "address size"
	_op .byte 0 "segment selector size"

	if { ${with-offset-array} } {
	  _op .4byte "$_debug_rnglists_list_count" "offset entry count"
	} else {
	  _op .4byte 0 "offset entry count"
	}

	define_label $post_header_label

	# Define the user post-header label, if provided.
	if { ${post-header-label} != "" } {
	    define_label ${post-header-label}
	}

	# Emit the offset array.
	if { ${with-offset-array} } {
	    for {set list_idx 0} {$list_idx < $_debug_rnglists_list_count} {incr list_idx} {
		set list_label [_compute_list_label $list_idx]
		_op .${_debug_rnglists_offset_size}byte "$list_label - $post_header_label" "offset of list $list_idx"
	    }
	}

	# Emit the actual list data.
	_emit "$lists_ops"

	define_label $table_end_label

	incr _debug_rnglists_table_count
    }

    # Generate one rnglists range list.
    #
    # This proc is meant to be used within proc _rnglists_table's body.  It is
    # made available as `list_` while inside proc _rnglists_table's body.
    #
    # BODY may call the various procs defined below to generate list entries.
    # They correspond to the range list entry kinds described in section 2.17.3
    # of the DWARF 5 spec.
    #
    # To define a label pointing to the beginning of the list, use the
    # conventional way of declaring and defining labels:
    #
    #   declare_labels the_list
    #
    #   the_list: list_ { ...  }

    proc _rnglists_list { body } {
	variable _debug_rnglists_list_count

	# Define a label for this list.  It is used to build the offset
	# array later.
	set list_label [_compute_list_label $_debug_rnglists_list_count]
	define_label $list_label

	with_override Dwarf::start_end Dwarf::_rnglists_start_end {
	    uplevel $body
	}

	# Emit end of list.
	_op .byte 0x00 "DW_RLE_end_of_list"

	incr _debug_rnglists_list_count
    }

    # Emit a rnglists DW_RLE_start_end entry.
    #
    # This proc is meant to be used within proc _rnglists_list's body.  It is
    # made available as `start_end` while inside proc _rnglists_list's body.

    proc _rnglists_start_end { start end } {
	variable _debug_rnglists_addr_size

	_op .byte 0x06 "DW_RLE_start_end"
	_op .${_debug_rnglists_addr_size}byte $start "start"
	_op .${_debug_rnglists_addr_size}byte $end "end"
    }

    # Emit a DWARF .debug_loclists section.
    #
    # The target address size is based on the current target's address size.
    #
    # BODY must be Tcl code that emits the content of the section.  It is
    # evaluated in the caller's context.
    #
    # The `is-64 true|false` options tells whether to use 64-bit DWARF instead
    # of 32-bit DWARF.  The default is 32-bit.

    proc loclists { options body } {
	variable _debug_loclists_addr_size
	variable _debug_loclists_offset_size
	variable _debug_loclists_is_64_dwarf

	parse_options {{"is-64" "false"}}

	if [is_64_target] {
	    set _debug_loclists_addr_size 8
	} else {
	    set _debug_loclists_addr_size 4
	}

	if { ${is-64} } {
	    set _debug_loclists_offset_size 8
	    set _debug_loclists_is_64_dwarf true
	} else {
	    set _debug_loclists_offset_size 4
	    set _debug_loclists_is_64_dwarf false
	}

	_section ".debug_loclists"

	# Count of tables in the section.
	variable _debug_loclists_table_count 0

	# Compute the label name for list at index LIST_IDX, for the current
	# table.

	proc _compute_list_label { list_idx } {
	    variable _debug_loclists_table_count

	    return ".Lloclists_table_${_debug_loclists_table_count}_list_${list_idx}"
	}

	with_override Dwarf::table Dwarf::_loclists_table {
	    uplevel $body
	}
    }

    # Generate one loclists table (header + offset array + location lists).
    #
    # This proc is meant to be used within proc loclists' body.  It is made
    # available as `table` while inside proc rnglists' body.
    #
    # BODY must be Tcl code that emits the content of the table.  It may call
    # the LIST_ procedure to generate rnglists.  It is evaluated in the
    # caller's context.
    #
    # The `post-header-label` option can be used to define a label just after
    # the header of the table.  This is the label that a DW_AT_loclists_base
    # attribute will usually refer to.
    #
    # The `with-offset-array true|false` option can be used to control
    # whether the headers of the location list tables have an array of
    # offset.  The default is true.

    proc _loclists_table { options body } {
	variable _debug_loclists_table_count
	variable _debug_loclists_addr_size
	variable _debug_loclists_offset_size
	variable _debug_loclists_is_64_dwarf

	parse_options {
	    {post-header-label ""}
	    {with-offset-array true}
	}

	# Count of lists in the table.
	variable _debug_loclists_list_count 0

	# Generate the lists ops first, because we need to know how many
	# lists there are to generate the header and offset table.
	set lists_ops [_defer_to_string {
	    with_override Dwarf::list_ Dwarf::_loclists_list {
		uplevel $body
	    }
	}]

	set post_unit_len_label \
	    [_compute_label "loclists_table_${_debug_loclists_table_count}_post_unit_len"]
	set post_header_label \
	    [_compute_label "loclists_table_${_debug_loclists_table_count}_post_header"]
	set table_end_label \
	    [_compute_label "loclists_table_${_debug_loclists_table_count}_end"]

	# Emit the table header.
	if { $_debug_loclists_is_64_dwarf } {
	    _op .4byte 0xffffffff "unit length 1/2"
	    _op .8byte "$table_end_label - $post_unit_len_label" "unit length 2/2"
	} else {
	    _op .4byte "$table_end_label - $post_unit_len_label" "unit length"
	}

	define_label $post_unit_len_label

	_op .2byte 5 "DWARF version"
	_op .byte $_debug_loclists_addr_size "address size"
	_op .byte 0 "segment selector size"

	if { ${with-offset-array} } {
	  _op .4byte "$_debug_loclists_list_count" "offset entry count"
	} else {
	  _op .4byte 0 "offset entry count"
	}

	define_label $post_header_label

	# Define the user post-header label, if provided.
	if { ${post-header-label} != "" } {
	    define_label ${post-header-label}
	}

	# Emit the offset array.
	if { ${with-offset-array} } {
	    for {set list_idx 0} {$list_idx < $_debug_loclists_list_count} {incr list_idx} {
		set list_label [_compute_list_label $list_idx]
		_op .${_debug_loclists_offset_size}byte "$list_label - $post_header_label" "offset of list $list_idx"
	    }
	}

	# Emit the actual list data.
	_emit "$lists_ops"

	define_label $table_end_label

	incr _debug_loclists_table_count
    }

    # Generate one loclists location list.
    #
    # This proc is meant to be used within proc _loclists_table's body.  It is
    # made available as `list_` while inside proc _loclists_table's body.
    #
    # BODY may call the various procs defined below to generate list
    # entries.  They correspond to the location list entry kinds
    # described in section 2.6.2 of the DWARF 5 spec.
    #
    # To define a label pointing to the beginning of the list, use
    # the conventional way of declaring and defining labels:
    #
    #   declare_labels the_list
    #
    #   the_list: list_ {
    #     ...
    #   }

    proc _loclists_list { body } {
	variable _debug_loclists_list_count

	# Count the location descriptions in this list.
	variable _debug_loclists_locdesc_count 0

	# Define a label for this list.  It is used to build the offset
	# array later.
	set list_label [_compute_list_label $_debug_loclists_list_count]
	define_label $list_label

	with_override Dwarf::start_length Dwarf::_loclists_start_length {
	with_override Dwarf::start_end Dwarf::_loclists_start_end {
	    uplevel $body
	}}

	# Emit end of list.
	_op .byte 0x00 "DW_LLE_end_of_list"

	incr _debug_loclists_list_count
    }

    # Emit a DW_LLE_start_length entry.
    #
    # This proc is meant to be used within proc _loclists_list's body.  It is
    # made available as `start_length` while inside proc _loclists_list's body.

    proc _loclists_start_length { start length locdesc } {
	variable _debug_loclists_is_64_dwarf
	variable _debug_loclists_addr_size
	variable _debug_loclists_offset_size
	variable _debug_loclists_table_count
	variable _debug_loclists_list_count
	variable _debug_loclists_locdesc_count

	set locdesc [uplevel [list subst $locdesc]]

	_op .byte 0x08 "DW_LLE_start_length"

	# Start and end of the address range.
	_op .${_debug_loclists_addr_size}byte $start "start"
	_op .uleb128 $length "length"

	# Length of location description.
	set locdesc_start_label ".Lloclists_table_${_debug_loclists_table_count}_list_${_debug_loclists_list_count}_locdesc_${_debug_loclists_locdesc_count}_start"
	set locdesc_end_label ".Lloclists_table_${_debug_loclists_table_count}_list_${_debug_loclists_list_count}_locdesc_${_debug_loclists_locdesc_count}_end"
	_op .uleb128 "$locdesc_end_label - $locdesc_start_label" "locdesc length"

	define_label $locdesc_start_label
	set dwarf_version 5
	_location $locdesc $dwarf_version $_debug_loclists_addr_size $_debug_loclists_offset_size
	define_label $locdesc_end_label

	incr _debug_loclists_locdesc_count
    }

    # Emit a DW_LLE_start_end entry.
    #
    # This proc is meant to be used within proc _loclists_list's body.  It is
    # made available as `start_end` while inside proc _loclists_list's body.

    proc _loclists_start_end { start end locdesc } {
	variable _debug_loclists_is_64_dwarf
	variable _debug_loclists_addr_size
	variable _debug_loclists_offset_size
	variable _debug_loclists_table_count
	variable _debug_loclists_list_count
	variable _debug_loclists_locdesc_count

	set locdesc [uplevel [list subst $locdesc]]

	_op .byte 0x07 "DW_LLE_start_end"

	# Start and end of the address range.
	_op .${_debug_loclists_addr_size}byte $start "start"
	_op .${_debug_loclists_addr_size}byte $end "end"

	# Length of location description.
	set locdesc_start_label ".Lloclists_table_${_debug_loclists_table_count}_list_${_debug_loclists_list_count}_locdesc_${_debug_loclists_locdesc_count}_start"
	set locdesc_end_label ".Lloclists_table_${_debug_loclists_table_count}_list_${_debug_loclists_list_count}_locdesc_${_debug_loclists_locdesc_count}_end"
	_op .uleb128 "$locdesc_end_label - $locdesc_start_label" "locdesc length"

	define_label $locdesc_start_label
	set dwarf_version 5
	_location $locdesc $dwarf_version $_debug_loclists_addr_size $_debug_loclists_offset_size
	define_label $locdesc_end_label

	incr _debug_loclists_locdesc_count
    }

    # Emit a DWARF .debug_line unit.
    # OPTIONS is a list with an even number of elements containing
    # option-name and option-value pairs.
    # Current options are:
    # is_64 0|1    - boolean indicating if you want to emit 64-bit DWARF
    #                default = 0 (32-bit)
    # version n    - DWARF version number to emit
    #                default = 4
    # addr_size n  - the size of addresses in bytes: 4, 8, or default
    #                default = default
    #
    # LABEL is the label of the current unit (which is probably
    # referenced by a DW_AT_stmt_list), or "" if there is no such
    # label.
    #
    # BODY is Tcl code that emits the parts which make up the body of
    # the line unit.  It is evaluated in the caller's context.  The
    # following commands are available for the BODY section:
    #
    #   include_dir "dirname" -- adds a new include directory
    #
    #   file_name "file.c" idx -- adds a new file name.  IDX is a
    #   1-based index referencing an include directory or 0 for
    #   current directory.

    proc lines {options label body} {
	variable _line_count
	variable _line_saw_file
	variable _line_saw_program
	variable _line_header_end_label

	# Establish the defaults.
	set is_64 0
	set _unit_version 4
	set _unit_addr_size default
	set _line_saw_program 0
	set _line_saw_file 0
	set _default_is_stmt 1

	foreach { name value } $options {
	    switch -exact -- $name {
		is_64 { set is_64 $value }
		version { set _unit_version $value }
		addr_size { set _unit_addr_size $value }
		default_is_stmt { set _default_is_stmt $value }
		default { error "unknown option $name" }
	    }
	}
	if {$_unit_addr_size == "default"} {
	    if {[is_64_target]} {
		set _unit_addr_size 8
	    } else {
		set _unit_addr_size 4
	    }
	}

	set unit_num [incr _line_count]

	set section ".debug_line"
	_section $section

	if { "$label" != "" } {
	    # Define the user-provided label at this point.
	    $label:
	}

	set unit_len_label [_compute_label "line${_line_count}_start"]
	set unit_end_label [_compute_label "line${_line_count}_end"]
	set header_len_label [_compute_label "line${_line_count}_header_start"]
	set _line_header_end_label [_compute_label "line${_line_count}_header_end"]

	if {$is_64} {
	    _op .4byte 0xffffffff
	    _op .8byte "$unit_end_label - $unit_len_label" "unit_length"
	} else {
	    _op .4byte "$unit_end_label - $unit_len_label" "unit_length"
	}

	define_label $unit_len_label

	_op .2byte $_unit_version version

	if {$is_64} {
	    _op .8byte "$_line_header_end_label - $header_len_label" "header_length"
	} else {
	    _op .4byte "$_line_header_end_label - $header_len_label" "header_length"
	}

	define_label $header_len_label

	_op .byte 1 "minimum_instruction_length"
	_op .byte $_default_is_stmt "default_is_stmt"
	_op .byte 1 "line_base"
	_op .byte 1 "line_range"
	_op .byte 10 "opcode_base"

	# The standard_opcode_lengths table.  The number of arguments
	# for each of the standard opcodes.  Generating 9 entries here
	# matches the use of 10 in the opcode_base above.  These 9
	# entries match the 9 standard opcodes for DWARF2, making use
	# of only 9 should be fine, even if we are generating DWARF3
	# or DWARF4.
	_op .byte 0 "standard opcode 1"
	_op .byte 1 "standard opcode 2"
	_op .byte 1 "standard opcode 3"
	_op .byte 1 "standard opcode 4"
	_op .byte 1 "standard opcode 5"
	_op .byte 0 "standard opcode 6"
	_op .byte 0 "standard opcode 7"
	_op .byte 0 "standard opcode 8"
	_op .byte 1 "standard opcode 9"

	proc include_dir {dirname} {
	    _op .ascii [_quote $dirname]
	}

	proc file_name {filename diridx} {
	    variable _line_saw_file
	    if "! $_line_saw_file" {
		# Terminate the dir list.
		_op .byte 0 "Terminator."
		set _line_saw_file 1
	    }

	    _op .ascii [_quote $filename]
	    _op .sleb128 $diridx
	    _op .sleb128 0 "mtime"
	    _op .sleb128 0 "length"
	}

	proc program {statements} {
	    variable _line_saw_program
	    variable _line_header_end_label
	    variable _line

	    set _line 1

	    if "! $_line_saw_program" {
		# Terminate the file list.
		_op .byte 0 "Terminator."
		define_label $_line_header_end_label
		set _line_saw_program 1
	    }

	    proc DW_LNE_set_address {addr} {
		_op .byte 0
		set start [new_label "set_address_start"]
		set end [new_label "set_address_end"]
		_op .uleb128 "${end} - ${start}"
		define_label ${start}
		_op .byte 2
		if {[is_64_target]} {
		    _op .8byte ${addr}
		} else {
		    _op .4byte ${addr}
		}
		define_label ${end}
	    }

	    proc DW_LNE_end_sequence {} {
		variable _line
		_op .byte 0
		_op .uleb128 1
		_op .byte 1
		set _line 1
	    }

	    proc DW_LNE_user { len opcode } {
		set DW_LNE_lo_usr 0x80
		set DW_LNE_hi_usr 0xff
		if { $DW_LNE_lo_usr <= $opcode
		     && $opcode <= $DW_LNE_hi_usr } {
		    _op .byte 0
		    _op .uleb128 $len
		    _op .byte $opcode
		    for {set i 1} {$i < $len} {incr i} {
			_op .byte 0
		    }
		} else {
		    error "unknown vendor specific extended opcode: $opcode"
		}
	    }

	    proc DW_LNS_copy {} {
		_op .byte 1
	    }

	    proc DW_LNS_negate_stmt {} {
		_op .byte 6
	    }

	    proc DW_LNS_advance_pc {offset} {
		_op .byte 2
		_op .uleb128 ${offset}
	    }

	    proc DW_LNS_advance_line {offset} {
		variable _line
		_op .byte 3
		_op .sleb128 ${offset}
		set _line [expr $_line + $offset]
	    }

	    # A pseudo line number program instruction, that can be used instead
	    # of DW_LNS_advance_line.  Rather than writing:
	    #   {DW_LNS_advance_line [expr $line1 - 1]}
	    #   {DW_LNS_advance_line [expr $line2 - $line1]}
	    #   {DW_LNS_advance_line [expr $line3 - $line2]}
	    # we can just write:
	    #   {line $line1}
	    #   {line $line2}
	    #   {line $line3}
	    proc line {line} {
		variable _line
		set offset [expr $line - $_line]
		DW_LNS_advance_line $offset
	    }

	    proc DW_LNS_set_file {num} {
		_op .byte 4
		_op .sleb128 ${num}
	    }

	    foreach statement $statements {
		uplevel 1 $statement
	    }
	}

	uplevel $body

	rename include_dir ""
	rename file_name ""

	# Terminate dir list if we saw no files.
	if "! $_line_saw_file" {
	    _op .byte 0 "Terminator."
	}

	# Terminate the file list.
	if "! $_line_saw_program" {
	    _op .byte 0 "Terminator."
	    define_label $_line_header_end_label
	}

	define_label $unit_end_label
    }

    # Emit a DWARF .debug_aranges entry.

    proc arange { options arange_start arange_length } {
	parse_options {
	    { comment "" }
	    { seg_sel "" }
	}

	if { $comment != "" } {
	    # Wrap
	    set comment " ($comment)"
	}

	if { $seg_sel != "" } {
	    variable _seg_size
	    if { $_seg_size == 8 } {
		set seg_op .8byte
	    } elseif { $_seg_size == 4 } {
		set seg_op .4byte
	    } else {
		error \
		    "Don't know how to handle segment selector size $_seg_size"
	    }
	    _op $seg_op $seg_sel "Address range segment selector$comment"
	}

	variable _addr_size
	if { $_addr_size == 8 } {
	    set addr_op .8byte
	} elseif { $_addr_size == 4 } {
	    set addr_op .4byte
	}

	_op $addr_op $arange_start "Address range start$comment"
	_op $addr_op $arange_length "Address range length$comment"
    }

    # Emit a DWARF .debug_aranges unit.
    #
    # OPTIONS is a list with an even number of elements containing
    # option-name and option-value pairs.
    # Current options are:
    # is_64 0|1    - boolean indicating if you want to emit 64-bit DWARF
    #                default = 0 (32-bit)
    # cu_is_64 0|1 - boolean indicating if LABEL refers to a 64-bit DWARF CU
    #                default = 0 (32-bit)
    # section_version n
    #                - section version number to emit
    #                default = 2
    # seg_size n   - the size of the adress selector in bytes: 0, 4, or 8
    #                default = 0
    #
    # LABEL is the label of the corresponding CU.
    #
    # BODY is Tcl code that emits the parts which make up the body of
    # the aranges unit.  It is evaluated in the caller's context.  The
    # following commands are available for the BODY section:
    #
    #   arange [-c <comment>] [<segment selector>] <start> <length>
    #     -- adds an address range.

    proc aranges { options label body } {
	variable _addr_size
	variable _seg_size

	# Handle options.
	parse_options {
	    { is_64 0 }
	    { cu_is_64 0 }
	    { section_version 2 }
	    { seg_size 0 }
	}
	set _seg_size $seg_size

	if { [is_64_target] } {
	    set _addr_size 8
	} else {
	    set _addr_size 4
	}

	# Switch to .debug_aranges section.
	_section .debug_aranges

	# Keep track of offset from start of section entry to determine
	# padding amount.
	set offset 0

	# Initial length.
	declare_labels aranges_start aranges_end
	set length "$aranges_end - $aranges_start"
	set comment "Length"
	if { $is_64 } {
	    _op .4byte 0xffffffff
	    _op .8byte $length $comment
	    incr offset 12
	} else {
	    _op .4byte $length $comment
	    incr offset 4
	}

	# Start label.
	aranges_start:

	# Section version.
	_op .2byte $section_version "Section version"
	incr offset 2

	# Offset into .debug_info.
	upvar $label my_label
	if { $cu_is_64 } {
	    _op .8byte $my_label "Offset into .debug_info"
	    incr offset 8
	} else {
	    _op .4byte $my_label "Offset into .debug_info"
	    incr offset 4
	}

	# Address size.
	_op .byte $_addr_size "Address size"
	incr offset

	# Segment selector size.
	_op .byte $_seg_size "Segment selector size"
	incr offset

	# Padding.
	set tuple_size [expr 2 * $_addr_size + $_seg_size]
	while { 1 } {
	    if { [expr $offset % $tuple_size] == 0 } {
		break
	    }
	    _op .byte 0 "Pad to $tuple_size byte boundary"
	    incr offset
	}

	# Range tuples.
	uplevel $body

	# Terminator tuple.
	set comment "Terminator"
	if { $_seg_size == 0 } {
	    arange {comment $comment} 0 0
	} else {
	    arange {comment $comment seg_sel 0} 0 0
	}

	# End label.
	aranges_end:
    }

    # Emit a .debug_loc entry.

    proc _loc_entry { start end location_description } {
	# Determine how to emit addresses.
	variable _addr_size
	if { $_addr_size == 8 } {
	    set addr_op .8byte
	} elseif { $_addr_size == 4 } {
	    set addr_op .4byte
	}

	# Emit start and end address.
	_op $addr_op $start "Start address"
	_op $addr_op $end "End address"

	declare_labels location_description_start
	declare_labels location_description_end

	# Emit length of location description.
	set len "$location_description_end - $location_description_start"
	_op .2byte $len "Location description length"

	# Tag start of location description.
	define_label $location_description_start

	# Emit location description.
	variable _cu_version
	variable _cu_offset_size
	_location $location_description $_cu_version $_addr_size \
	    $_cu_offset_size

	# Tag end of location description.
	define_label $location_description_end
    }

    # Emit a DWARF .debug_loc contribution.
    #
    # OPTIONS is a list with an even number of elements containing
    # option-name and option-value pairs.
    # Current options are:
    # cu_is_64 0|1 - boolean indicating if references from location
    #                descriptions refer to a 64-bit DWARF CU.
    #                default = 0 (32-bit)
    # cu_version n - section version of DWARF CU referenced from location
    #                descriptions.
    #                default = 4
    #
    # BODY is Tcl code that emits the parts which make up the body of
    # the debug_loc contribution.  It is evaluated in the caller's context.
    # The following command is available for the BODY section:
    #
    #   entry <start> <end> <location description>
    #     -- emit a .debug_loc entry

    proc loc { options body } {
	# Handle options.
	parse_options {
	    { cu_version 4 }
	    { cu_is_64 0 }
	}

	# Export for use in BODY.
	variable _addr_size
	if { [is_64_target] } {
	    set _addr_size 8
	} else {
	    set _addr_size 4
	}
	variable _cu_version
	set _cu_version $cu_version
	variable _cu_offset_size
	if { $cu_is_64 == 1 } {
	    set _cu_offset_size 8
	} else {
	    set _cu_offset_size 4
	}

	# Switch to .debug_loc section.
	_section .debug_loc

	# Introduce command 'entry'.
	with_override Dwarf::entry Dwarf::_loc_entry {
	    # Emit entries.
	    uplevel $body
	}

	# Determine how to emit addresses.
	if { $_addr_size == 8 } {
	    set addr_op .8byte
	} elseif { $_addr_size == 4 } {
	    set addr_op .4byte
	}

	# Emit <End of list>.
	set comment "<End of list>"
	_op $addr_op 0 "$comment (Part 1/2)"
	_op $addr_op 0 "$comment (Part 2/2)"
    }

    proc _empty_array {name} {
	upvar $name the_array

	catch {unset the_array}
	set the_array(_) {}
	unset the_array(_)
    }

    # Emit a .gnu_debugaltlink section with the given file name and
    # build-id.  The buildid should be represented as a hexadecimal
    # string, like "ffeeddcc".
    proc gnu_debugaltlink {filename buildid} {
	_defer_output .gnu_debugaltlink {
	    _op .ascii [_quote $filename]
	    foreach {a b} [split $buildid {}] {
		_op .byte 0x$a$b
	    }
	}
    }

    proc _note {type name hexdata} {
	set namelen [expr [string length $name] + 1]

	# Name size.
	_op .4byte $namelen
	# Data size.
	_op .4byte [expr [string length $hexdata] / 2]
	# Type.
	_op .4byte $type
	# The name.
	_op .ascii [_quote $name]
	# Alignment.
	set align 2
	set total [expr {($namelen + (1 << $align) - 1) & -(1 << $align)}]
	for {set i $namelen} {$i < $total} {incr i} {
	    _op .byte 0
	}
	# The data.
	foreach {a b} [split $hexdata {}] {
	    _op .byte 0x$a$b
	}
    }

    # Emit a note section holding the given build-id.
    proc build_id {buildid} {
	_defer_output {.note.gnu.build-id a note} {
	    # From elf/common.h.
	    set NT_GNU_BUILD_ID 3

	    _note $NT_GNU_BUILD_ID GNU $buildid
	}
    }

    # Emit a dummy CU.
    proc dummy_cu {} {
	# Generate a CU with default options and empty body.
	cu {label dummy_cu} {
	}

	# Generate an .debug_aranges entry for the dummy CU.
	aranges {} dummy_cu {
	}
    }

    # The top-level interface to the DWARF assembler.
    # FILENAME is the name of the file where the generated assembly
    # code is written.
    # BODY is Tcl code to emit the assembly.  It is evaluated via
    # "eval" -- not uplevel as you might expect, because it is
    # important to run the body in the Dwarf namespace.
    #
    # A typical invocation is something like:
    #    Dwarf::assemble $file {
    #        cu 0 2 8 {
    #            compile_unit {
    #            ...
    #            }
    #        }
    #        cu 0 2 8 {
    #        ...
    #        }
    #    }
    proc assemble {filename body} {
	variable _initialized
	variable _output_file
	variable _deferred_output
	variable _defer
	variable _label_num
	variable _strings
	variable _cu_count
	variable _line_count
	variable _line_saw_file
	variable _line_saw_program
	variable _line_header_end_label
	variable _debug_ranges_64_bit
	variable _debug_addr_index

	if {!$_initialized} {
	    _read_constants
	    set _initialized 1
	}

	set _output_file [open $filename w]
	set _cu_count -1
	_empty_array _deferred_output
	set _defer ""
	set _label_num 0
	_empty_array _strings

	set _line_count 0
	set _line_saw_file 0
	set _line_saw_program 0
	set _debug_ranges_64_bit [is_64_target]

	set _debug_addr_index 0

	# Dummy CU at the start to ensure that the first CU in $body is not
	# the first in .debug_info.
	dummy_cu

	# Not "uplevel" here, because we want to evaluate in this
	# namespace.  This is somewhat bad because it means we can't
	# readily refer to outer variables.
	eval $body

	# Dummy CU at the end to ensure that the last CU in $body is not
	# the last in .debug_info.
	dummy_cu

	_write_deferred_output

	catch {close $_output_file}
	set _output_file {}
    }
}
