+ support for nested procedural variables:
o activate using {$modeswitch nestedprocvars} (compatible with all
regular syntax modes, enabled by default for MacPas mode)
o activating this mode switch changes the way the frame pointer is
passed to nested routines into the same way that Delphi uses (always
passed via the stack, and if necessary removed from the stack by
the caller) -- Todo: possibly also allow using this parameter
passing convention without enabling nested procvars, maybe even
by default in Delphi mode, see mantis #9432
o both global and nested routines can be passed to/assigned to a
nested procvar (and called via them). Note that converting global
*procvars* to nested procvars is intentionally not supported, so
that this functionality can also be implemented via compile-time
generated trampolines if necessary (e.g. for LLVM or CIL backends
as long as they don't support the aforementioned parameter passing
convention)
o a nested procvar can both be declared using a Mac/ISO Pascal style
"inline" type declaration as a parameter type, or as a stand-alone
type (in the latter case, add "is nested" at the end in analogy to
"of object" for method pointers -- note that using variables of
such a type is dangerous, because if you call them once the enclosing
stack frame no longer exists on the stack, the results are
undefined; this is however allowed for Metaware Pascal compatibility)
git-svn-id: trunk@15694 -
reset_used_unit_defs()/reset_all_defs() calls:
o removed resetting tprocdef.procstarttai/procendtai and
instead check in the debug writers whether the def is
in the current unit or not to determine whether we should
write debug info for it
o use the collected defs in the wpoinfo structure to reset
the wpo flags in the defs, instead of iterating over all
defs in the program and resetting them that way
- removed now unused "is_reset" flag from tmodule
git-svn-id: trunk@15501 -
- sort of reverted r14134, which is no longer required after the above
change (new_section() inserts the alignment itself)
* made the tai_section.create() constructor private so it cannot be
called directly anymore
git-svn-id: trunk@15482 -
(it means that if the pointer is nil, the value is invalid; that's not the
case here, it just means that they are empty)
* generate upper bound of -1 (for dynarrays) or 0 (for ansi/unicodestrings)
if they are not allocated, so gdb can calculate their length as 0
(all based on tips by Jan Kratochvil)
git-svn-id: trunk@15288 -
search for an existing section with the same content first. This reduces the
generated executable size, compilation time and memory usage of the compiler
git-svn-id: trunk@15103 -
- add own symbol table for enumeration to store enumeration elements
- reimplement enumeration member traverse using symbol table instead of firstenum/nextenum - that members are removed
- implement TEnum.Element access syntax - element is searched in the enumeration symtable in this case instead of global/local symtables
- implement {$SCOPEDENUM ON/OFF} local switch
+ tests
git-svn-id: trunk@15051 -
properties/behaviour of the equivalent of Extended in C (i.e., to
"long double" on i386 and x86_64 platforms that support a 10 byte
long double, and to "double" elsewhere)
git-svn-id: trunk@14912 -
because the 'this' parameter was not used by gdb in that case for anything
anyway, and as of gdb 7.0 you get an error in gdb because the 'this'
parameter is not an aggregate in that case (but rather a pointer to the
vmt) (mantis #15362)
git-svn-id: trunk@14446 -
info with the classname, like is done for Stabs. Not done by default
because otherwise once calling methods from the debugger is implemented,
this would require typing classinstance.classname__methodname
git-svn-id: trunk@14337 -
a) use DW_TAG_variable instead of DW_TAG_constant in combination with a
DW_AT_constant_value, since that way gdb does support formal constants
b) store constant strings as either a shortstring or a longstring rather
than using DW_FORM_string, since gdb's Pascal printer doesn't support
gdb's generic STRING type yet for output
git-svn-id: trunk@14336 -
mark_NoLineinfoEnd
* add "no line info" markers for try/except and try/finally internal cleanup
code, so the debugger doesn't jump back and forth between the end and start
of exception blocks when you arrive at the end
* honour "no line info" markers in dbgdwarf.pas
git-svn-id: trunk@14327 -
procdefs after writing it, so that it can be written multiple times in
different units. It was only written once now, namely the first time it
was used. If this occurred before the implementation had been parsed, then
no info about low/high pc was written for this procdef.
* checking whether procstarttai is assigned is not a good way to determine
whether or not a procdef is defined in the current unit (it can also be
set if we are in the middle of parsing a uses clause, since all procdefs
are only reset afterwards). Check whether the parent static/globalsymtable
"iscurrentunit" instead.
git-svn-id: trunk@13912 -
o add accessibility info for fields and methods (public/protected/private)
o write method type info for methods not implemented in the current module
(for tf_dwarf_only_local_labels systems)
git-svn-id: trunk@13833 -
special treatment required to put self as the first parameter in the
debug info
+ added Apple-specific Objective-C related DWARF attributes
* properly emit debug information for Objective-C classes and methods
* fixed some typos in comments
* properly mark "absolute" local variables mapped to parameters as
variables in the debug info rather than as parameters (gdb expects one
parameter to be passed when calling functions from inside gdb per
parameter mentioned in the debug info, even if multiple parameters
have the same stack address)
git-svn-id: branches/objc@13723 -
Darwin anymore), because otherwise if unit A is compiled without debug
info and unit B uses one of its types, the debug info will contain no
DW_TAG_typedef for that type and hence gdb will not recognise it as
a type definition that's part of the program.
git-svn-id: trunk@13424 -
starting with a previous 2.3.1 or compiler built from the objc branch
+ added basic objcprotocol support (only for external protocols
currently)
o use in type declaration: "type xp = objcprotocol ... end;"
o when defining a root class that implements it:
"type yc = objcclass(xp) ... end" (note: no support yet
for something like "objcclass(id,xp)" or so)
o when defining a non-root class that implements a protocol:
"type zc = objcclass(nsobject,xp) ... end"
o includes support for "required" and "optional" sections
o no support yet for the objcprotocol(<protocol>) expression
that enables getting a class instance representing the
protocol (e.g., for use with "conformsToProtocol:")
o message names have to specified in protocol declarations,
but if an objcclass implements a protocol, the message names do
not have to be repeated (but if they are, they have to match;
the same goes when overriding inherited methods)
+ allow specifying the external name of Objective-C classes and
protocols, since classes and protocols can have the same name
(and you cannot use the same Pascal identifier in such caseq)
+ added NSObject protocol, and make the NSObject class use it
+ added missing NSObject class methods that have the same name
as instance methods (added "class" name prefix to avoid clashes)
* fixed several cases where the compiler did not treat Objective-C
classes/protocols the same as Object Pascal classes/interfaces
(a.o., forward declarations, alignment, regvars, several type
conversions, ...)
* allow "override" directive in objcclass declarations, and print
a hint if it's forgotten in an external declaration (because it
doesn't really matter there, and may make automated header
conversion harder than necessary) and an error if will be used in
a non-external declaration (because it is not possible to start
a new vmt entry-tree in Objective-C, you can only override parent
methods)
* reject objcclasses/protocols as parameters to typeof()
* don't try to test VMT validity of objcclasses/protocols
git-svn-id: branches/objc@13375 -
TDebugInfoDwarf, so DWARFv2 and DWARFv3 generators can share protected
methods.
* fixed the debug info for sets whose language-level lower bound is not
equal to the actual set base used when storing the data (e.g., a "set
of 1..5" is actually stored as a "set of 0..7" or "set of 0..31")
(mantis #13984)
+ interactive test for the above
git-svn-id: trunk@13302 -
* Use DW_AT_byte_stride when possible, because gdb does not support DW_AT_stride_size
* Add stride to dynamic-array definitions
git-svn-id: trunk@13280 -
o support for declaring external Objective-C classes (see
rtl/inc/objcbase.pas), including derived classes
o support for converting methods of objcclasses into selectors
(see tests/test/tobjc1.pp)
o support for loading from/storing to fields of objcclasses
o support for calling Objective-C methods using regular
Object Pascal syntax (see tests/test/tobjc1.pp)
o some things that are known to be not yet working:
o automatic conversion from ID to objcclasses and back
o declaring and implementing new objcclasses/methods in Pascal code
o debug information (objcclasses are currently plain pointers
as far as the debugger knows)
git-svn-id: branches/objc@13162 -
linker does not like two global labels both pointing at the end of a
section (causes "atom sorting error" warnings), and this happened for
units without any code after r13098
git-svn-id: trunk@13111 -
attribute is available via the new append_attribute() method
(to enable easily adding extra attributes)
* write the definitions of methods as child entries of the
objectdef, instead of in the global scope
* only write DW_AT_calling_convention and DW_AT_external attributes
if their value is different from the DWARF default one
+ write DW_AT_virtuality and DW_AT_vtable_elem_location attributes
for virtual methods
* write the debug info for the hidden "self" parameter before all
other parameters and mark it as "artificial", because that is
how GDB distinguishes regular methods from static methods
git-svn-id: trunk@13003 -
Borland's i386 calling convention (its value may still change)
* specify the calling convention of each procedure in the DWARF info
* don't add the function result twice or even thrice to the debug
info, and don't add it at all to the parameter lists (even if it's
a hidden parameter, gdb will automatically add it according to the
ABI rules when calling the function)
-> calling "register" functions/procedures works with my experimental
gdb patch (methods not yet tested, and probably won't work yet)
git-svn-id: trunk@12995 -
of in the DWARF, as it's more efficient and avoids a gdb bug which
occurs on some platforms (thanks to Jan Kratochvil for the tip,
http://sourceware.org/ml/gdb/2009-03/msg00094.html )
git-svn-id: trunk@12905 -
Needs a fix in gdb when referencing a location relative to a
global variable (an array element other than the first, a field
other than the first) on Mac OS X and when using external debug
info on Linux/Windows.
git-svn-id: trunk@12877 -