Changeset 229

Show
Ignore:
Timestamp:
08/03/06 13:52:39 (2 years ago)
Author:
pragma
Message:

Fixed Extern Index references

Files:

Legend:

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

    r227 r229  
    121121} 
    122122 
    123 void parse(inout EXTDEF[] externs,OMFReader reader){ 
     123void parse(inout EXTDEF[] externs,inout LString[] externNames,OMFReader reader){ 
    124124    while(reader.hasMore()){ 
    125125        EXTDEF extdef;       
    126126        extdef.parse(reader); 
    127         externs ~= extdef;   
     127        externs ~= extdef; 
     128         
     129        externNames ~= extdef.name; 
    128130    } 
    129131} 
     
    663665} 
    664666 
    665 void parse(inout COMDEF[] commonDefinitions,OMFReader reader){ 
     667void parse(inout COMDEF[] commonDefinitions,inout LString[] externNames,OMFReader reader){ 
    666668    while(reader.hasMore()){ 
    667669        COMDEF def; 
    668670        def.parse(reader); 
    669671        commonDefinitions ~= def; 
     672        externNames ~= def.communalName; 
    670673    } 
    671674} 
     
    686689} 
    687690 
    688 void parse(inout CEXTDEF[] commonExterns,OMFReader reader){ 
     691void parse(inout CEXTDEF[] commonExterns,inout LString[] externNames,LString[] names,OMFReader reader){ 
    689692    while(reader.hasMore()){ 
    690693        CEXTDEF def; 
    691694        def.parse(reader); 
    692695        commonExterns ~= def; 
     696        externNames ~= names[def.nameIndex]; 
    693697    } 
    694698} 
     
    862866    LString libraryName; 
    863867    LString[] names; 
     868    LString[] externNames; 
    864869     
    865870    // comment sub data 
     
    905910        names.length = names.length+1; 
    906911        externs.length = externs.length+1; 
     912        externNames.length = externNames.length+1; 
    907913         
    908914        while(mainReader.hasMore()){ 
     
    929935             
    930936            case 0x8C: //EXTDEF 
    931                 .parse(externs,reader); 
     937                .parse(externs,externNames,reader); 
    932938                break; 
    933939             
     
    965971                 
    966972            case 0xB0: //COMDEF 
    967                 .parse(communalDefinitions,reader);  
     973                .parse(communalDefinitions,externNames,reader);  
    968974                break; 
    969975                 
    970976            case 0xBC: //CEXTDEF 
    971                 .parse(communalExterns,reader);  
     977                .parse(communalExterns,externNames,names,reader);  
    972978                break; 
    973979                 
     
    10451051         
    10461052    public char[] toString(){ 
    1047         char[] getExternName(uint index){ 
    1048             uint workingIndex = index;           
    1049             if(workingIndex < communalExterns.length){ 
    1050                 return cast(char[])names[communalExterns[workingIndex].nameIndex]; 
    1051             } 
    1052             workingIndex -= communalExterns.length; 
    1053             if(workingIndex < externs.length){ 
    1054                 return cast(char[])externs[workingIndex].name;               
    1055             } 
    1056             workingIndex -= externs.length; 
    1057             if(workingIndex < communalDefinitions.length){ 
    1058                 return cast(char[])communalDefinitions[workingIndex].communalName; 
    1059             } 
    1060         }    
    1061          
    10621053        char[] result = ""; 
    10631054        ExtSprintClass sprint = new ExtSprintClass(1024); 
     
    10881079        foreach(idx,weak; weakExterns){ 
    10891080            with(weak){ 
    1090                 char[] defaultName = getExternName(resolutionIndex)
    1091                 char[] weakName = getExternName(weakIndex)
     1081                char[] defaultName = externNames[resolutionIndex]
     1082                char[] weakName = externNames[weakIndex]
    10921083                uint externsLength = externs.length; 
    10931084                uint cextedfsLength = communalExterns.length;    
     
    11531144                 
    11541145                if(isExternStyleFixup){ 
    1155                     targetName = "extern: " ~ getExternName(targetIndex)
     1146                    targetName = "extern: " ~ cast(char[])externNames[targetIndex]
    11561147                } 
    11571148                else{ 
  • trunk/ddl/omf/OMFModule.d

    r227 r229  
    4747     
    4848    struct Fixup{ 
    49         uint targetIndex; 
    5049        bool isExternStyleFixup; 
    5150        bool isSegmentRelative; 
     51        uint targetSegmentIndex; 
     52        ExportSymbolPtr targetSymbol; 
    5253        ExportSymbolPtr destSymbol; 
    5354        uint destSymbolOffset; 
     
    106107            // get the fixup value 
    107108            if(isExternStyleFixup){ 
    108                 auto sym  = &(symbols[targetIndex-1]); 
    109                 if(sym.type != SymbolType.Strong){ 
     109                if(targetSymbol.type != SymbolType.Strong){ 
    110110                    remainingFixups ~= fix; 
    111111                    continue; 
    112112                } 
    113                 fixupValue = cast(uint)(sym.address); 
     113                fixupValue = cast(uint)(targetSymbol.address); 
    114114            } 
    115115            else{ 
    116                 fixupValue = cast(uint)(segmentImages[targetIndex].data.ptr); 
     116                fixupValue = cast(uint)(segmentImages[targetSegmentIndex].data.ptr); 
    117117            } 
    118118            debug debugLog("fixup dest [%0.8X] (%0.8X) = fixupValue [%0.8X] rel:%d",destAddress,*cast(uint*)destAddress,fixupValue,cast(uint)isSegmentRelative); 
     
    393393            newFix.isSegmentRelative = fix.isSegmentRelative; 
    394394            newFix.isExternStyleFixup = fix.isExternStyleFixup; 
    395             newFix.targetIndex = fix.targetIndex; 
    396395            newFix.destSymbolOffset = 0; 
    397396            newFix.destSymbol = null; 
    398397            newFix.destSegmentAddress = null; 
     398             
     399            // resolve the target to a symbol or segment index, dependeing on the fixup style 
     400            if(fix.isExternStyleFixup){ 
     401                newFix.targetSymbol = symbolXref[cast(char[])binary.externNames[fix.targetIndex]]; 
     402            } 
     403            else{ 
     404                newFix.targetSegmentIndex = fix.targetIndex; 
     405            } 
    399406             
    400407            if(fix.destNameIndex > 0){ 
     
    452459                         
    453460                    if(isExternStyleFixup){ 
    454                         result ~= sprint(" | %s [%0.8X]",symbols[targetIndex-1].name,symbols[targetIndex-1].address); 
     461                        result ~= sprint(" | %s [%0.8X]",targetSymbol.name,targetSymbol.address); 
    455462                    } 
    456463                    else{ 
    457                         result ~= sprint(" | segment #%d [%0.8X]",targetIndex,segmentImages[targetIndex].data.ptr); 
     464                        result ~= sprint(" | segment #%d [%0.8X]",targetSegmentIndex,segmentImages[targetSegmentIndex].data.ptr); 
    458465                    } 
    459466                    result ~= "\n"; 
  • trunk/test/linktest2.d

    r228 r229  
    7272    auto testLibrary = linker.loadAndLink("test\\testmodule.obj"); 
    7373     
    74     /* 
     74     
    7575    //direct invocation of linked ctor 
    7676    auto testCtor = testLibrary.getCtor!(ITestClass,"test.testmodule.TestClass")(); 
     
    8080     
    8181    // exception test from module function 
    82     auto exceptionTest = testLibrary.getDExport!(void function(),"test.testmodule.exceptionTest2")(); 
     82    auto exceptionTest = testLibrary.getDExport!(void function(),"test.testmodule.exceptionTest")(); 
    8383    try{ 
    8484        exceptionTest(); 
     
    8686        Stdout.println("Exception Test Passed. %s",e.toString()); 
    8787    } 
    88     */ 
     88     
    8989     
    9090    void* exceptionTestAddr = testLibrary.getSymbol("_D4test10testmodule14exceptionTest2FZv").address; 
  • trunk/utils/ddlinfo_bn.d

    r224 r229  
    22// This file is automatically maintained by the BUILD utility, 
    33// Please refrain from manually editing it. 
    4 long auto_build_number = 713
     4long auto_build_number = 727