Changeset 117

Show
Ignore:
Timestamp:
08/16/05 20:10:25 (3 years ago)
Author:
pragma
Message:

Working prototype parser, with fixup display support.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/ddl/omfloader.d

    r116 r117  
    170170 
    171171class FixupRecord{ 
    172     EnumDataRecord dataRecord; 
    173     bit isSegmentRelative; 
    174     uint offset; 
    175      
    176  
    177     public this(){ 
    178         dataRecord = EnumDataRecord.Null; 
    179     } 
    180  
     172    char[] info; // real fixup is done at parse time 
     173     
    181174    public char[] toString(){ 
    182         return std.string.format("%s relative: %s @%d",dataRecord.base.name,isSegmentRelative,dataRecord.offset + offset)
     175        return info
    183176    } 
    184177     
     
    399392            uint consumed = cursor.parseIndex(cast(ubyte[])comment,externIndex);  
    400393            cursor.parseIndex(cast(ubyte[])comment[consumed..$],defaultIndex); // thrown out 
    401              
     394                         
     395            debug writefln("[[weakextern parsed]]"); 
    402396            //NOTE: this is due to a bug in the DMC backend (spec states that the index is fine as-is) 
    403397            externIndex--; 
     
    446440        external.typeIndex = cursor.getIndex(); 
    447441        this.externs ~= external; 
     442        debug writefln("[[single extern name parsed]]"); 
    448443    } 
    449444 
     
    653648                    targetDisplacement = cursor.getVWord(); 
    654649                } 
    655                  
     650                                
    656651                debug{ 
    657                     EnumDataRecord enumData = this.enumData[$-1]; 
    658                      
    659                     uint address = enumData.offset + offset; 
    660                      
    661                     writef("fixup - %s : %0.2X | offset: %0.4X | segrel: %s",enumData.base.name,enumData.offset,address,isSegmentRelativeFixup); 
    662                      
    663                     writef(" | frame: "); 
     652                    FixupRecord fixup = new FixupRecord(); 
     653                 
     654                    char[] output; 
     655                    output ~= std.string.format("fixup - segrel: %s offset: %d",isSegmentRelativeFixup,offset); 
     656 
     657                    output ~= std.string.format(" | target: "); 
     658                    switch(targetMethod){                    
     659                    case 0: targetDisplacement = 0; 
     660                    case 4: output ~= std.string.format("displacement: %d segment: %s",targetDisplacement,this.segments[targetDatum].name); break; 
     661 
     662                    case 1: targetDisplacement = 0; 
     663                    case 5: output ~= std.string.format("displacement: %d group %s",targetDisplacement,this.groups[targetDatum].name); break; 
     664 
     665                    case 2: targetDisplacement = 0; 
     666                    case 6: output ~= std.string.format("displacement: %d extern %d of %d",targetDisplacement,targetDatum,this.externs.length); break; 
     667 
     668                    default: 
     669                        output ~= std.string.format("<invalid>"); 
     670                    } 
     671 
     672                    output ~= " | frame: "; 
    664673                    switch(frameMethod){ 
    665                     case 0: writef("segment %s",this.segments[frameDatum].name); break; 
    666                     case 1: writef("group %s",this.groups[frameDatum].name); break; 
    667                     case 2: writef("extern %s",this.externs[frameDatum].name); break; 
    668                     case 4: writef("segment %s",this.segments[$-1].name); break; 
    669                     case 5: writef("[target]"); break; 
     674                    case 0: output ~= std.string.format("segment %s",this.segments[frameDatum].name); break; 
     675                    case 1: output ~= std.string.format("group %s",this.groups[frameDatum].name); break; 
     676                    case 2: output ~= std.string.format("extern %s",this.externs[frameDatum].name); break; //TODO: go to pubdef to get segment 
     677                    case 4: output ~= std.string.format("enum data segment %s",this.enumData[$-1].base.name); break; 
     678                    case 5: output ~= std.string.format("[same as target]"); break; 
    670679                    case 3:  
    671680                    default: 
    672                         writef("<invalid>")
     681                        output ~= "<invalid>"
    673682                    } 
    674683                     
    675                     writef(" | target: "); 
    676                     switch(targetMethod){ 
     684                    fixup.info = output; 
    677685                     
    678                     case 0: writef("(displacment: %d) ",targetDisplacement); 
    679                     case 4: writef("segment %s",this.segments[targetDatum].name); break; 
    680                      
    681                     case 1: writef("(displacment: %d) ",targetDisplacement); 
    682                     case 5: writef("group %s",this.groups[targetDatum].name); break; 
    683                      
    684                     case 2: writef("(displacment: %d) ",targetDisplacement); 
    685                     case 6: writef("extern %s",this.externs[frameDatum].name); break; 
    686                      
    687                     default: 
    688                         writef("<invalid>"); 
    689                     } 
    690                      
    691                     writefln(""); 
     686                    this.fixups ~= fixup; 
    692687                } 
    693688            } 
     
    714709                                     
    715710            this.externs ~= external; 
     711            debug writefln("[[extern name parsed]]"); 
    716712        } 
    717713    }