Multics Technical Bulletin MTB-734 Simple Language Support for ALM To: Distribution From: Richard Gray Date: 20 June 1986 Subject: The Implementation of Features to Allow ALM to Support Languages 1. Abstract This MTB describes features to be added to ALM to allow it to be used as an intermediary by various compilers. These features are: - The addition of a subroutine interface to ALM that will allow language translators to invoke the assembler directly. - The ability to specify initialization information for external variables. - Support for a new class of type 5 links called *heap links. - The ability to generate text section entry sequences that are usable by probe. Comments on this MTB should be sent to the author - via Multics mail: JRGray.Multics on System M via posted mail: Richard Gray Advanced Computing Technology Center Foothills Professional Building Room #301, 1620 - 29th Street N.W. Calgary, Alberta T2N 4L7 CANADA via telephone: (403)-284-6400 (403)-284-6410 via forum on System-M to: >udd>m>DGHowe>mtgs_dir>c>c_imp (c) _________________________________________________________________ Multics project internal documentation; not to be reproduced or distributed outside the Multics project. MTB-734 Multics Technical Bulletin Simple Language Support for ALM TABLE OF CONTENTS Section Page Subject ======= ==== ======= 1 i Abstract 2 1 Preface 3 2 Introduction 4 3 Addition of a Subroutine Interface 4.1 4 . . Include File alm_info 4.2 5 . . Description of Include File 5 7 Support Initialization of External Variables 5.1 7 . . Addition of Link Initialization Data 5.2 7 . . Extension of the join Pseudo-Operation 5.3 8 . . Example Program 6 9 Support for *heap links 7 10 An Entry Pseudo-Operation Usable by Probe 7.1 11 . . Example Program Multics Technical Bulletin MTB-734 Simple Language Support for ALM 2. Preface The purpose of this MTB is to describe various changes and enhancements to ALM which will expedite its use as an intermediary in the generation of object segments (by compilers like the C compiler). This MTB will limit itself to describing simple changes that will allow the straightforward support of language features. There will be another MTB which will describe more features that will allow debugging (symbol table support) as well as other more complex features. MTB-734 Multics Technical Bulletin Simple Language Support for ALM 3. Introduction Various language translators and compilers (notably the Unix C compiler) are written to generate assembler source code. This source code is then run through an appropriate assembler to generate an object segment. We are proposing several new features to be added to ALM to support such use: The addition of a subroutine interface to ALM that will allow language translators to invoke the assembler directly. The ability to specify initialization information for external variables. Support for a new class of type 5 links called *heap links. The ability to generate text section entry sequences that conform to probe's conventions. The following sections describe these features in more detail. Multics Technical Bulletin MTB-734 Simple Language Support for ALM 4. Addition of a Subroutine Interface The addition of an interface to ALM will allow language translators to invoke the assembler directly as a subroutine, rather than indirectly through cu_$cp. Function: The alm_ entrypoint will generate a Multics object segment (and optionally a listing file) from information passed in an info structure. Syntax: dcl alm_ entry(ptr, ptr, fixed bin, fixed bin(35)); call alm_(alm_info_ptr, alm_args_ptr, severity, code); Arguments: alm_info_ptr is a pointer to the alm_info structure. This structure is described in the include file alm_info.incl.pl1. (Input) alm_args_ptr is a pointer to the alm_args structure. This structure is used to store arguments used by the macro &A facility and is described in the include file alm_info.incl.pl1. (Input) severity is the severity of the most serious error encountered while attempting to assemble the program. (Output) code is a standard system status code. (Output) MTB-734 Multics Technical Bulletin Simple Language Support for ALM 4.1. Include File alm_info The following include file describes the structures used to pass information to the alm_ subroutine: /* BEGIN INCLUDE FILE alm_info.incl.pl1 */ /* Written June 9, 1986 by JRGray */ /* This include files describes the alm_info and alm_args structures that are used to pass information to the alm_ subroutine. */ dcl 1 alm_info based, 2 version char(8), 2 flags, 3 (symbols, brief, list, table) bit(1) unaligned, 3 pad bit(32) unaligned, 2 target char(32), 2 generator_info, 3 generator char(8), 3 gen_number fixed bin, 3 gen_version char(160), 3 gen_created fixed bin(71), 2 option_string char(200) varying, 2 source_path char(168), 2 source_entryname char(32), 2 source_ptr ptr, 2 source_bc fixed bin(21), 2 object_ptr ptr, 2 object_bc fixed bin(21), 2 list_fcb_ptr ptr, 2 list_component_ptr ptr, 2 list_bc fixed bin(21), 2 list_component fixed bin; dcl 1 alm_args based, 2 version char(8), 2 arg_count fixed bin, 2 arg(0 refer alm_args.arg_count), 3 arg_ptr ptr, 3 len fixed bin(21); dcl ALM_INFO_V1 char(8) static options(constant) init("alm_i_1"); dcl ALM_ARGS_V1 char(8) static options(constant) init("alm_a_1"); /* END INCLUDE FILE alm_info.incl.pl1 */ Multics Technical Bulletin MTB-734 Simple Language Support for ALM 4.2. Description of Include File where: version is the version string for the alm_info structure, currently defined by the constant ALM_INFO_V1 (Input) symbols if set then generate a cross-reference listing for symbols. (Input) brief if set then suppress the printing of error messages. (Input) list if set then generate a program listing. (Input) table if set then generate a symbol table for the program. (Input) target specifies the target machine. (Input) generator_info is used to specify information about the object segment generator. See description of the std_symbol_header in MPM Ref Manual Appendix G for more details. generator is the name of the generator. (Input) gen_number is the number of the generator. (Input) gen_version is the version of the generator. (Input) gen_created is the time that the generator was created. (Input) option_string is the option string that describes options used to compile the program. (Input) source_path is the pathname of the source. (Input) source_entryname is the entryname of the actual source. (Input) source_ptr is a pointer the base of the source. (Input) source_bc is the bitcount of the source. (Input) object_ptr is a pointer to the base of the object segment. (Input) object_bc is the bitcount of the object segment. (Output) MTB-734 Multics Technical Bulletin Simple Language Support for ALM list_fcb_ptr is a pointer to the file control block that describes the listing. For more information on MSF FCBs, see the description of msf_manager_ in MPM Subroutines. (Input) list_component_ptr is a pointer to the first component of the listing. (Input) list_bc is the bitcount of the last component of the listing. For more information see the description of msf_manager_$adjust in MPM Subroutines. (Output) list_component is the number of the last component of the listing. For more information see the description of msf_manager_$adjust in MPM Subroutines. (Output) version is the version string for the alm_args structure, currently defined by the constant ALM_ARGS_V1. (Input) arg_count is the number of arguments. (Input) arg_ptr is a pointer to a character string argument. (Input) arg_len is the length of a character string argument. (Input) Multics Technical Bulletin MTB-734 Simple Language Support for ALM 5. Support Initialization of External Variables There are two features that will be added to ALM to support the initialization of external variables. The first feature is the ability to 'join' information to the definition section of object segments. The second feature is the ability to specify that such information will be used to initialize external variables. The definitions of these two new features is followed by an example program and object segment dump. 5.1. Addition of Link Initialization Data Some languages (C in particular) require initialization data for type 5 links (*system and *heap). This requirement necessitates the use of a new pseudo-operation that will associate initialization data with a link value. EXAMPLE: init_link initdata,external_reference where: initdata is the offset within the definition region of the initialization data (usually a label). external_reference is a reference to a type 5 link (*system or *heap). 5.2. Extension of the join Pseudo-Operation The extension of the 'join' pseudo-operation will allow the merging of use-blocks into the definition section. This will give ALM the ability to specify initialization information using normal ALM pseudo-operations. EXAMPLE: join /definition/name1,name2... MTB-734 Multics Technical Bulletin Simple Language Support for ALM 5.3. Example Program "This program returns the value of the external variable " 'integer_x' into its first argument. This program specifys the " initial value of integer_x as 25. name init_example entry init_example init_example: lda <*system>|[integer_x] "Get integer_x sta pr0|2,* "Return in first arg short_return init_link init_x,<*system>|[integer_x] use defn " initialization structure for 'integer_x' init_x: oct 1 "size = 1 word oct 3 "type link_init_copy_info oct 31 "Initial value 25 decimal join /definition/defn end Dump of relevant parts of object segment: 0 T 0 la 400010235120 lda pr4|8,* 1 T 1 aa 000002755120 sta pr0|2,* 2 T 2 aa 700044710120 tra pr7|36,* 54 D 46 aa 011151156164 1 acc_string 'integer_x' 55 D 47 aa 145147145162 " 56 D 50 aa 137170000000 " 1 type_pair, <*system>|[integer_x] 57 D 51 ad 000005000057 2 (type 5, trap_relp 57), 60 D 52 ad 000005000046 2 (segname_relp 5, offsetname_relp 46); 63 D 55 da 000051000000 1 exp_word,(type_relp 51, expression 0); 65 D 57 aa 000000000001 1 link_init_copy_info, n_words 1, 66 D 60 aa 000000000003 2 type 3, 67 D 61 aa 000000000031 2 initial_data; 100 L 10 ia 777770000046 1 object_link, header_relp -10, tag 46, 101 L 11 da 000055000000 2 expression_relp 55; In this example program you can see that the initialization structure (at init_x D57) has been added to the definition section. You can also see that the trap_relp in the link's type_pair (at D51) points to the initialization structure. Multics Technical Bulletin MTB-734 Simple Language Support for ALM 6. Support for *heap links The requirements of external variables in the language 'C' have resulted in the addition of a new kind of link: *heap links. (See MTB732 for more details). We are adding the ability to reference such links via ALM. A *heap link is of type 5 and class 6 (a *system link is of type 5 and class 5). A reference to a *heap link will be generated from expressions of the form: <*heap>|[varname] . Multics Links Link Description Type 1 <*section>|offset 2 base|[symbol] (obsolete) 3 refname|offset 4 refname$entryname 5 <typename>|[varname] (typename is *system or *heap; *system is class 5, *heap is 6) MTB-734 Multics Technical Bulletin Simple Language Support for ALM 7. An Entry Pseudo-Operation Usable by Probe Probe requires the use of entry sequences that (a) are generated inline at the location of the entrypoint, (b) use a different operator call using more information, and (c) push a stackframe. A forthcoming MTB will describe use of probe with ALM. Since entry points require definition section offset values, we are defining a new pseudo-operation called 'ext_entry' to be used for this purpose. This new pseudo-op differs from the current alm 'entry' psuedo-op in three major ways: | Current | New | entry | ext_entry | | Pushes stack frame | NO | YES | | Location of entry | end of text sect | Inline (at label) sequence | | | | Value of pr0 | arg list pointer | pl1_operators_ pointer | | operator call | alm_entry | ext_entry Note: that the instruction: 'epp0 pr6|26,*' will load pr0 with the address of the argument list. EXAMPLE: elabel: ext_entry elabel,stacksize,dlabel where: elabel is the name of the label that identifies the entrypoint. stacksize is an octal number specifying the size of the stack frame. Note this number is rounded up to the nearest mod 16 boundary. dlabel is the name of the label that identifies the descriptor information. Multics Technical Bulletin MTB-734 Simple Language Support for ALM 7.1. Example Program " This program swaps its first and second arguments name ee_example ee_example: ext_entry ee_example,120,desc epp0 pr6|26,* "ext_entry doesn't set pr0 temp temp_var "stack temp 'temp_var' lda pr0|2,* "get first arg sta pr6|temp_var "store in temp_var lda pr0|4,* "get second arg sta pr0|2,* "store in first arg lda pr6|temp_var "get first arg from temp_var sta pr0|4,* "store in second arg return "ext_entry require return " parameter descriptor list desc: zero 2,char4 "2 args, addr of first arg desc zero char4,0 " addr of second arg desc, 0 char4: oct 526000000004 "char(4) end MTB-734 Multics Technical Bulletin Simple Language Support for ALM Dump of relevant parts of object segment: 1 entry_sequence, 0 T 0 ta 000017000000 2 (descr_relp_offset 17), 1 T 1 da 000011300000 2 def_relp 11, flags [rev_1,has_desc], 2 T 2 aa 000120627000 2 code_sequence [eax7 80]; 3 T 3 aa 700034352120 epp2 pr7|28,* 4 T 4 aa 201045272100 tsp2 pr2|549 5 T 5 aa 000000000000 6 T 6 as 000000000134 7 T 7 aa 600032350120 epp0 pr6|26,* 10 T 10 aa 000002235120 lda pr0|2,* 11 T 11 aa 600100755100 sta pr6|64 12 T 12 aa 000004235120 lda pr0|4,* 13 T 13 aa 000002755120 sta pr0|2,* 14 T 14 aa 600100235100 lda pr6|64 15 T 15 aa 000004755120 sta pr0|4,* 16 T 16 aa 700042710120 tra pr7|34,* 1 parm_desc_ptr, 17 T 17 at 000002000021 2 n_args 2, descriptor_relp(1) 21, 20 T 20 ta 000021000000 descriptor_relp(2) 21; 21 T 21 aa 526000000004 1 arg_desc,(flag 1,type 21,packed,len 4); 1 definition [ee_example], 33 D 11 dd 000017000003 2 (forward_relp 17, backward_relp 3), 34 D 12 ta 000002500000 2 thing_relp 2, 2 (flags [new,entry], class 0), 35 D 13 dd 000014000003 2 (name_relp 14, segname_relp 3); 36 D 14 aa 012145145137 1 acc_string 'ee_example' 37 D 15 aa 145170141155 " 40 D 16 aa 160154145000 " 1 runtime_block, [ee_example] 234 S134 aa 440100000016 2 [flag,standard,] type 1,start 16, In this example program you can see that the flag has_descriptors is set (T1). At T0 you can see that the address of the parameter descriptor structure is correct (T17). The stack frame size of 80 (120 octal) is specified in the instruction at location T2. The 134 octal at location T6 is the address in the symbol section of the entry's runtime_block.