[Oberon] Dynamic local array implementation
Chris Burrows
chris at cfbsoftware.com
Fri Oct 13 03:32:54 CEST 2017
>
> From: Luca Boasso [mailto:luke.boasso at gmail.com]
> Sent: Friday, 13 October 2017 10:06 AM
> To: chris at cfbsoftware.com; ETH Oberon and related systems
> Subject: Re: [Oberon] Dynamic local array implementation
>
>
> The Astrobe compiler does use a frame pointer. Given the local
> variable 'a' declared as:
>
> VAR
> a: ARRAY OF INTEGER;
>
> The code generated by NEW(a, 10) is as follows:
>
> MOV r10,10
> STR r10,[fp,-8]
> MOV r10,r10 lsl 2
> SUB sp,sp,r10
> STR sp,[fp,-4]
>
>
> I see, that is similar to what I was expecting.
> If my understanding is correct, [fp, -8] and [fp, -4] represent an
> array descriptor, where you store the length and address on the stack
> respectively. SP is decremented by length*element size to make space
> for the array.Very neat!
> Is [fp,-4] the beginning or the end of the array "a"?
>
[fp,-4] corresponds to a[0]
> I have checked "An Oberon Compiler for the ARM Processor" p. 26 and
> it seems like in that compiler dynamic arrays are allocated on the
> heap:
>
No - global dynamic arrays were allocated on the heap but local dynamic arrays were allocated on the stack. In that compiler a corresponding call was generated to the procedure MAU.AllocH or MAU.AllocS respectively. Astrobe used to do the same but now generates inline code for local dynamic array variables instead.
>
> Do you know if that system had a garbage collector?
Apparently not (p. 25 of the same document):
"It is used for recording the hierarchy of extensions of a type (see below), and contains the necessary meta information about the type that is needed by a garbage collector. The latter information is not generated in this current implementation, with the exception of the record’s size."
Regards,
Chris Burrows
CFB Software
http://www.astrobe.com
More information about the Oberon
mailing list