diff options
Diffstat (limited to 'gas/README-vms')
-rw-r--r-- | gas/README-vms | 248 |
1 files changed, 0 insertions, 248 deletions
diff --git a/gas/README-vms b/gas/README-vms deleted file mode 100644 index f3ee10e..0000000 --- a/gas/README-vms +++ /dev/null @@ -1,248 +0,0 @@ - This document explains a couple of things that are specific to VMS. -There are currently two "chapters", the first deals with cross-assembly -issues, and the second deals with the VMS debugger and GNU-CC. - - -*********************************************************************** -****************** Notes for Cross Assembly with VMS ****************** -*********************************************************************** - - If you wish to build gas on a non-VMS system to cross-assemble, -you should use: - -configure ${hosttype} -target=vms - -and then follow the usual procedure. The object files generated on -Unix will be correct from a binary point of view, but the real trick is -getting them to the VMS machine. The format of the object file is -a variable-length record, but each record contains binary data. gas -writes the records in the same format that VMS would expect, -namely a two-byte count followed by that number of bytes. - - If you try to copy the file to a VMS system using ftp, the ftp -protocol will screw up the file by looking for nulls (record terminator for -unix) and it will insert it's own record terminators at that point. This -will obviously corrupt the file. - - If you try to transfer the file with ftp in binary mode, the -file itself will not be corrupt, but VMS will think that the file contains -fixed-length records of 512 bytes. You can use the public-domain FILE -utility to change this with a command like: - -$FILE foo.o/type=variable - -If you do not have this utility available, the following program can be -used to perform this task: - - #include <fab.h> - - #define RME$C_SETRFM 1 - - struct FAB * fab; - - main(int argc, char * argv[]){ - int i, status; - fab = (struct FAB*) malloc(sizeof(struct FAB)); - *fab = cc$rms_fab; /* initialize FAB*/ - fab->fab$b_fac = FAB$M_PUT; - fab->fab$l_fop |= FAB$M_ESC; - fab->fab$l_ctx = RME$C_SETRFM; - fab->fab$w_ifi = 0; - for(i=1;i<argc;i++){ - printf("Setting %s to variable length records.\n",argv[i]); - fab->fab$l_fna = argv[i]; - fab->fab$b_fns = strlen(argv[i]); - status = sys$open(fab,0,0); - if((status & 7) != 1) lib$signal(status); - fab->fab$b_rfm = FAB$C_VAR; - status = sys$modify(fab,0,0); - if((status & 7) != 1) lib$signal(status); - status = sys$close(fab,0,0); - if((status & 7) != 1) lib$signal(status); - }; - } - - If you have NFS running on the VMS system, what you need to do -depends upon which NFS software you are running on the VMS system. There -are a number of different TCP/IP packages for VMS available, and only very -limited testing has been performed. In the tests that has been done so -far, the contents of the file will always be correct when transferring the -file via NFS, but the record attributes may or may not be correct. - - One proprietary TCP/IP/NFS package for VMS is known to -automatically fix the record attributes of the object file if you NFS mount -a unix disk from the VMS system, and if the file has a ".obj" extension on -the unix system. Other TCP/IP packages might do this for you as well, but -they have not been checked. - -No matter what method you use to get the file to the VMS system, it is -always a good idea to check to make sure that it is the correct type by -doing a "$dir/full" on the object file. The desired record attributes will -be "None". Undesirable record attributes will be "Stream-LF" or anything -else. - -Once you get the files on the VMS system, you can check their integrity -with the "$anal/obj" command. (Naturally at some point you should rename -the .o files to .obj). As far as the debugger is concerned, the records -will be correct, but the debugger will not be able to find the source files, -since it only has the file name, and not the full directory specification. -You must give the debugger some help by telling it which directories to -search for the individual files - once you have done this you should be -able to proceed normally. - - It is a good idea to use names for your files which will be valid -under VMS, since otherwise you will have no way of getting the debugger to -find the source file when deugging. - -The reason for this is that the object file normally contins specific -information that the debugger can use to positively identify a file, and if -you are assembling on a unix system this information simply does not exist -in a meaningful way. You must help the debugger by using the "SET FILE=" -command to tell the debugger where to look for source files. The debugger -records will be correct, except that the debugger will not be initially -able to find the source files. You can use the "SET FILE" command to tell -the debugger where to look for the source files. - -I have only tested this with a SVr4 i486 machine, and everything seems to -work OK, with the limited testing that I have done. Other machines may -or may not work. You should read the chapters on cross-compilers in the gcc -manual before fooling with this. Since gas does not need to do any floating -point arithmetic, the floating point constants that are generated here should -be correct - the only concern is with constant folding in the main compiler. -The range and precision of floats and doubles are similar on the 486 (with -a builtin 80387) and the VAX, although there is a factor of 2 to 4 -difference in the range. The double, as implemented on the 486, is quite -similar to the G_FLOAT on the VAX. - -*********************************************************************** -****************** Notes for using GNU CC with the VMS debugger******** -*********************************************************************** - - - 1) You should be aware that GNU-C, as with any other decent compiler, -will do things when optimization is turned on that you may not expect. -Sometimes intermediate results are not written to variables, if they are only -used in one place, and sometimes variables that are not used at all will not be -written to the symbol table. Also, parameters to inline functions are often -inaccessible. You can see the assembly code equivalent by using KP7 in the -debugger, and from this you can tell if in fact a variable should have the -value that you expect. You can find out if a variable lives withing a register -by doing a 'show symbol/addr'. - - 2) Overly complex data types, such as: - -int (*(*(*(*(*(* sarr6)[1])[1])[2])[3])[4])[5]; - -will not be debugged properly, since the debugging record overflows an internal -debugger buffer. gcc-as will convert these to *void as far as the debugger -symbol table is concerned, which will avoid any problems, and the assembler -will give you a message informing you that this has happened. - - 3) You must, of course, compile and link with /debug. If you link -without debug, you still get traceback table in the executable, but there is no -symbol table for variables. - - 4) Included in the patches to VMS.C are fixes to two bugs that are -unrelated to the changes that I have made. One of these made it impossible to -debug small programs sometimes, and the other caused the debugger to become -confused about which routine it was in, and give this incorrect info in -tracebacks. - - 5) If you are using the GNU-C++ compiler, you should modify the -compiler driver file GNU_CC:[000000]GCC.COM (or GXX.COM). If you have a -separate GXX.COM, then you need to change one line in GXX.COM to: -$ if f$locate("D",p2) .ne. P2_Length then Debug = " ""-G0""" - Notice zero---> ^ -If you are using a GCC.COM that does both C and C++, add the following lines to -GCC.COM: - -$! -$! Use old style debugging records for VMS -$! -$ if (Debug.nes."" ).and. Plus then Debug = " ""-G0""" - -after the variables Plus and Debug are set. The reason for this, is that C++ -compiler by default generates debugging records that are more complex, -with many new syntactical elements that allow for the new features of the -language. The -G0 switch tells the C++ compiler to use the old style debugging -records. Until the debugger understands C++ there is not any point to try and -use the expanded syntax. - - 6) When you have nested scopes, i.e.: -main(){ - int i; - {int i; - {int i; -};};} -and you say "EXAM i" the debugger needs to figure out which variable you -actually want to reference. I have arranged things to define a block to the -debugger when you use brackets to enter a new scope, so in the example above, -the variables would be described as: -TEST\main\i -TEST\main\$0\i -TEST\main\$0\$0\i -At each level, the block name is a number with a dollar sign prefix, the -numbers start with 0 and count upward. When you say EXAM i, the debugger looks -at the current PC, and decides which block it is currently in. It works from -the innermost level outward until it finds a block that has the variable "i" -defined. You can always specify the scope explicitly. - - 7) With C++, there can be a lot of inline functions, and it would be -rather restrictive to force the user to debug the program by converting all of -the inline functions to normal functions. What I have done is to essentially -"add" (with the debugger) source lines from the include files that contain the -inline functions. Thus when you step into an inline function it appears as if -you have called the function, and you can examine variables and so forth. -There are several *very* important differences, however. First of all, since -there is no function call involved, you cannot step over the inline function -call - you always step into it. Secondly, since the same source lines are used -in many locations, there is a separate copy of the source for *each* usage. -Without this, breakpoints do not work, since we must have a 1-to-1 mapping -between source lines and PC. - Since you cannot step over inline function calls, it can be a real pain -if you are not really interested in what is going on for that function call. -What I have done is to use the "-D" switch for the assembler to toggle the -following behavior. With the "-D" switch, all inline functions are included in -the object file, and you can debug everything. Without the "-D" switch -(default case with VMS implementation), inline functions are included *only* if -they did not come from system header files (i.e. from GNU_CC_INCLUDE: or -GNU_GXX_INCLUDE:). Thus, without the switch the user only debugs his/her own -inline functions, and not the system ones. (This is especially useful if you do -a lot of stream I/O in C++). This probably will not provide enough granularity -for many users, but for now this is still somewhat experimental, and I would -like to reflect upon it and get some feedback before I go any further. -Possible solutions include an interactive prompting, a logical name, or a new -command line option in gcc.c (which is then passed through somehow to the guts -of the assembler). - The inline functions from header files appear after the source code -for the source file. This has the advantage that the source file itself is -numbered with the same line numbers that you get with an editor. In addition, -the entire header file is not included, since the assembler makes a list of -the min and max source lines that are used, and only includes those lines from -the first to the last actually used. (It is easy to change it to include the -whole file). - - 8) When you are debugging C++ objects, the object "this" is refered to -as "$this". Actually, the compiler writes it as ".this", but the period is -not good for the debugger, so I have a routine to convert it to a $. (It -actually converts all periods to $, but only for variables, since this was -intended to allow us to access "this". - - 9) If you use the asm("...") keyword for global symbols, you will not -be able to see that symbol with the debugger. The reason is that there are two -records for the symbol stored in the data structures of the assembler. One -contains the info such as psect number and offset, and the other one contains -the information having to do with the data type of the variable. In order to -debug as symbol, you need to be able to coorelate these records, and the only -way to do this is by name. The record with the storage attributes will take -the name used in the asm directive, and the record that specifies the data type -has the actual variable name, and thus when you use the asm directive to change -a variable name, the symbol becomes invisible. - - 10) Older versions of the compiler ( GNU-C 1.37.92 and earlier) place -global constants in the text psect. This is unfortunate, since to the linker -this appears to be an entry point. I sent a patch to the compiler to RMS, -which will generate a .const section for these variables, and patched the -assembler to put these variables into a psect just like that for normal -variables, except that they are marked NOWRT. static constants are still -placed in the text psect, since there is no need for any external access. |