Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • driver/as.cc

    ra499702 r80219a8  
    55// file "LICENCE" distributed with Cforall.
    66//
    7 // as.c -- map assembler file, scan for debug information, then language code, and skip N lines forward to code. If
    8 //         code is C dialect, possibly expand file by one character, and replace with Cforall language code.
     7// as.c -- map assembler file, scan for debug information. If found, expand file by one character and insert Cforall
     8//         language code on the N line from the start of the debug information.
    99//
    1010// Author           : Peter A. Buhr
    1111// Created On       : Wed Aug  1 10:49:42 2018
    1212// Last Modified By : Peter A. Buhr
    13 // Last Modified On : Wed Dec  8 07:56:12 2021
    14 // Update Count     : 136
     13// Last Modified On : Sat Sep  8 08:40:16 2018
     14// Update Count     : 97
    1515//
    1616
     
    1818#include <cstdlib>                                                                              // exit
    1919#include <fcntl.h>                                                                              // open
    20 #include <cstring>                                                                              // strstr, memmove
    21 #include <unistd.h>                                                                             // ftruncate,execvp
    22 #include <sys/stat.h>                                                                   // fstat
     20#include <unistd.h>
     21#include <sys/stat.h>
    2322#include <sys/mman.h>                                                                   // mmap
     23#include <string.h>
    2424
    2525//#define __DEBUG_H__
     26
     27#ifdef __DEBUG_H__
     28#include <iostream>
     29using namespace std;
     30#endif // __DEBUG_H__
    2631
    2732int main( const int argc, const char * argv[] ) {
    2833        #ifdef __DEBUG_H__
    2934        for ( int i = 0; i < argc; i += 1 ) {
    30                 fprintf( stderr, "%s\n", argv[i] );
     35                cerr << argv[i] << endl;
    3136        } // for
    3237        #endif // __DEBUG_H__
     
    4348                if ( start == (void *)-1 ) { perror( "mmap" ); exit( EXIT_FAILURE ); };
    4449
    45                 char * dcursor;
    46                 if ( (dcursor = strstr( start, ".Ldebug_info0:" ) ) ) { // debug information ?
     50                if ( char * cursor = strstr( start, ".Ldebug_info0:" ) ) { // debug information ?
     51                        // Expand file by one byte to hold 2 character Cforall language code.
     52                        if ( ftruncate( fd, size + 1 ) ) { perror( "ftruncate" ); exit( EXIT_FAILURE ); };
    4753
    48                         if ( char * cursor = strstr( dcursor, ".long\t.LASF" ) ) { // language code ?
    49                                 for ( int i = 0; i < 2; i += 1 ) {              // move N (magic) lines forward
    50                                         cursor = strstr( cursor, "\n" ) + 1;
    51                                 } // for
    52                                 cursor -= 2;                                                    // backup over "d\n", where d is a hex digit
    53                                 // From elfcpp/dwarf.h in the binutils source tree.
    54                                 // DW_LANG_C89 = 0x1, DW_LANG_C = 0x2, DW_LANG_C99 = 0xc, DW_LANG_C11 = 0x1d
    55                                 if ( *(cursor - 2) == '0' && *(cursor - 1) == 'x' &&
    56                                          (*cursor == 'c' || *cursor == '1' || *cursor == '2') ) { // C99/C89/C
    57                                         // Expand file by one byte to hold 2 character Cforall language code.
    58                                         if ( ftruncate( fd, size + 1 ) ) { perror( "ftruncate" ); exit( EXIT_FAILURE ); };
    59                                         memmove( cursor + 2, cursor + 1, start + size - cursor - 1 ); // move remaining text 1 character right
    60                                 } else if ( *(cursor - 3) == '0' && *(cursor - 2) == 'x' && *(cursor - 1) == '1' && *cursor == 'd' ) { // C11
    61                                 } else {
    62                                         for ( int i = 0; i < 6; i += 1 ) {      // move N (magic) lines forward
    63                                                 cursor = strstr( cursor, "\n" ) + 1;
    64                                         } // for
    65                                         fprintf( stderr, "*** ERROR *** Invalid C language code found in assembler file: %s\n"
    66                                                          "Assembler debug information:\n%.*s",
    67                                                          argv[argc - 1], (int)(cursor - dcursor), dcursor );
    68                                         exit( EXIT_FAILURE );
    69                                 } // if
     54                        for ( int i = 0; i < 8; i += 1 ) {                      // move N (magic) lines forward
     55                                cursor = strstr( cursor, "\n" ) + 1;
     56                        } // for
    7057
    71                                 *(cursor - 1) = '2';                                    // replace C89/C/C99/C11 language code with CFA code
    72                                 *cursor = '5';
    73                         } // if
     58                        cursor -= 2;                                                            // backup over "c\n" language value
     59                        if ( *(cursor - 1) != 'x' ) { fprintf( stderr, "invalid C language code\n" ); exit( EXIT_FAILURE ); };
     60
     61                        memmove( cursor + 2, cursor + 1, start + size - cursor - 1 ); // move remaining text 1 character right
     62
     63                        *(cursor) = '2';                                                        // replace C language value with CFA
     64                        *(cursor + 1) = '5';
    7465                } // if
    7566
Note: See TracChangeset for help on using the changeset viewer.