| Index: gdb/doc/LRS
|
| diff --git a/gdb/doc/LRS b/gdb/doc/LRS
|
| deleted file mode 100644
|
| index 7e25d432a3eec275ad3907f543745fe6dcb618d4..0000000000000000000000000000000000000000
|
| --- a/gdb/doc/LRS
|
| +++ /dev/null
|
| @@ -1,197 +0,0 @@
|
| -What's LRS?
|
| -===========
|
| -
|
| -LRS, or Live Range Splitting is an optimization technique which allows
|
| -a user variable to reside in different locations during different parts
|
| -of a function.
|
| -
|
| -For example, a variable might reside in the stack for part of a function
|
| -and in a register during a loop and in a different register during
|
| -another loop.
|
| -
|
| -Clearly, if a variable may reside in different locations, then the
|
| -compiler must describe to the debugger where the variable resides for
|
| -any given part of the function.
|
| -
|
| -This document describes the debug format for encoding these extensions
|
| -in stabs.
|
| -
|
| -Since these extensions are gcc specific, these additional symbols and
|
| -stabs can be disabled by the gcc command option -gstabs.
|
| -
|
| -
|
| -GNU extensions for LRS under stabs:
|
| -===================================
|
| -
|
| -
|
| -range symbols:
|
| --------------
|
| -
|
| - A range symbol will be used to mark the beginning or end of a
|
| - live range (the range which describes where a symbol is active,
|
| - or live). These symbols will later be referenced in the stabs for
|
| - debug purposes. For simplicity, we'll use the terms "range_start"
|
| - and "range_end" to identify the range symbols which mark the beginning
|
| - and end of a live range respectively.
|
| -
|
| - Any text symbol which would normally appear in the symbol table
|
| - (eg. a function name) can be used as range symbol. If an address
|
| - is needed to delimit a live range and does not match any of the
|
| - values of symbols which would normally appear in the symbol table,
|
| - a new symbol will be added to the table whose value is that address.
|
| -
|
| - The three new symbol types described below have been added for this
|
| - purpose.
|
| -
|
| - For efficiency, the compiler should use existing symbols as range
|
| - symbols whenever possible; this reduces the number of additional
|
| - symbols which need to be added to the symbol table.
|
| -
|
| -
|
| -New debug symbol type for defining ranges:
|
| -------------------------------------------
|
| -
|
| - range_off - contains PC function offset for start/end of a live range.
|
| - Its location is relative to the function start and therefore
|
| - eliminates the need for additional relocation.
|
| -
|
| - This symbol has a values in the text section, and does not have a name.
|
| -
|
| - NOTE: the following may not be needed but are included here just
|
| - in case.
|
| - range - contains PC value of beginning or end of a live range
|
| - (relocs required).
|
| -
|
| - NOTE: the following will be required if we desire LRS debugging
|
| - to work with old style a.out stabs.
|
| - range_abs - contains absolute PC value of start/end of a live
|
| - range. The range_abs debug symbol is provided for
|
| - completeness, in case there is a need to describe addresses
|
| - in ROM, etc.
|
| -
|
| -
|
| -Live range:
|
| ------------
|
| -
|
| - The compiler and debugger view a variable with multiple homes as
|
| - a primary symbol and aliases for that symbol. The primary symbol
|
| - describes the default home of the variable while aliases describe
|
| - alternate homes for the variable.
|
| -
|
| - A live range defines the interval of instructions beginning with
|
| - range_start and ending at range_end-1, and is used to specify a
|
| - range of instructions where an alias is active or "live". So,
|
| - the actual end of the range will be one less than the value of the
|
| - range_end symbol.
|
| -
|
| - Ranges do not have to be nested. Eg. Two ranges may intersect while
|
| - each range contains subranges which are not in the other range.
|
| -
|
| - There does not have to be a 1-1 mapping from range_start to
|
| - range_end symbols. Eg. Two range_starts can share the same
|
| - range_end, while one symbol's range_start can be another symbol's
|
| - range_end.
|
| -
|
| - When a variable's storage class changes (eg. from stack to register,
|
| - or from one register to another), a new symbol entry will be
|
| - added to the symbol table with stabs describing the new type,
|
| - and appropriate live ranges refering to the variable's initial
|
| - symbol index.
|
| -
|
| - For variables which are defined in the source but optimized away,
|
| - a symbol should be emitted with the live range l(0,0).
|
| -
|
| - Live ranges for aliases of a particular variable should always
|
| - be disjoint. Overlapping ranges for aliases of the same variable
|
| - will be treated as an error by the debugger, and the overlapping
|
| - range will be ignored.
|
| -
|
| - If no live range information is given, the live range will be assumed to
|
| - span the symbol's entire lexical scope.
|
| -
|
| -
|
| -New stabs string identifiers:
|
| ------------------------------
|
| -
|
| - "id" in "#id" in the following section refers to a numeric value.
|
| -
|
| - New stab syntax for live range: l(<ref_from>,<ref_to>)
|
| -
|
| - <ref_from> - "#id" where #id identifies the text symbol (range symbol) to
|
| - use as the start of live range (range_start). The value for
|
| - the referenced text symbol is the starting address of the
|
| - live range.
|
| -
|
| - <ref_to> - "#id" where #id identifies the text symbol (range symbol) to
|
| - use as the end of live range (range_end). The value for
|
| - the referenced text symbol is ONE BYTE PAST the ending
|
| - address of the live range.
|
| -
|
| -
|
| - New stab syntax for identifying symbols.
|
| -
|
| - <def> - "#id="
|
| -
|
| - Uses:
|
| - <def><name>:<typedef1>...
|
| - When used in front of a symbol name, "#id=" defines a
|
| - unique reference number for this symbol. The reference
|
| - number can be used later when defining aliases for this
|
| - symbol.
|
| - <def>
|
| - When used as the entire stab string, "#id=" identifies this
|
| - nameless symbol as being the symbol for which "#id" refers to.
|
| -
|
| -
|
| - <ref> - "#id" where "#id" refers to the symbol for which the string
|
| - "#id=" identifies.
|
| - Uses:
|
| - <ref>:<typedef2>;<liverange>;<liverange>...
|
| - Defines an alias for the symbol identified by the reference
|
| - number ID.
|
| - l(<ref1>,<ref2>)
|
| - When used within a live range, "#id" refers to the text
|
| - symbol identified by "#id=" to use as the range symbol.
|
| -
|
| - <liverange> - "l(<ref_from>,<ref_to>)" - specifies a live range for a
|
| - symbol. Multiple "l" specifiers can be combined to represent
|
| - mutiple live ranges, separated by semicolons.
|
| -
|
| -
|
| -
|
| -
|
| -Example:
|
| -========
|
| -
|
| -Consider a program of the form:
|
| -
|
| - void foo(){
|
| - int a = ...;
|
| - ...
|
| - while (b--)
|
| - c += a;
|
| - ..
|
| - d = a;
|
| - ..
|
| - }
|
| -
|
| -Assume that "a" lives in the stack at offset -8, except for inside the
|
| -loop where "a" resides in register "r5".
|
| -
|
| -The way to describe this is to create a stab for the variable "a" which
|
| -describes "a" as living in the stack and an alias for the variable "a"
|
| -which describes it as living in register "r5" in the loop.
|
| -
|
| -Let's assume that "#1" and "#2" are symbols which bound the area where
|
| -"a" lives in a register.
|
| -
|
| -The stabs to describe "a" and its alias would look like this:
|
| -
|
| - .stabs "#3=a:1",128,0,8,-8
|
| - .stabs "#3:r1;l(#1,#2)",64,0,0,5
|
| -
|
| -
|
| -This design implies that the debugger will keep a chain of aliases for
|
| -any given variable with aliases and that chain will be searched first
|
| -to find out if an alias is active. If no alias is active, then the
|
| -debugger will assume that the main variable is active.
|
|
|