Changeset 224
- Timestamp:
- 08/02/06 14:27:59 (2 years ago)
- Files:
-
- trunk/ddl/DynamicModule.d (modified) (2 diffs)
- trunk/ddl/Linker.d (modified) (10 diffs)
- trunk/ddl/Mangle.d (modified) (1 diff)
- trunk/ddl/insitu/InSituModule.d (modified) (1 diff)
- trunk/ddl/omf/OMFBinary.d (modified) (12 diffs)
- trunk/ddl/omf/OMFModule.d (modified) (8 diffs)
- trunk/test/linktest0.d (added)
- trunk/test/linktest2.d (added)
- trunk/test/testconfig.d (modified) (1 diff)
- trunk/test/testmodule.d (modified) (2 diffs)
- trunk/utils/bless_bn.d (modified) (1 diff)
- trunk/utils/ddlinfo_bn.d (modified) (1 diff)
- trunk/utils/insitu_bn.d (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/ddl/DynamicModule.d
r218 r224 135 135 is undefined and could easily result in a protection-fault/segmentation-fault. 136 136 */ 137 public b itisResolved();137 public bool isResolved(); 138 138 139 139 /** … … 146 146 If true, the module is being linked. If false, the module is not being linked. 147 147 */ 148 public b itisLinking;148 public bool isLinking; 149 149 } 150 150 trunk/ddl/Linker.d
r221 r224 109 109 return this.registry; 110 110 } 111 111 112 112 /** 113 113 Initalizes a ModuleInfo instance from a DynamicModule. … … 116 116 */ 117 117 protected void initModule(ModuleInfo m, int skip){ 118 if( !m) return;118 if(m is null) return; 119 119 if (m.flags & MIctordone) return; 120 120 121 121 debug debugLog("this module: %0.8X",cast(void*)m); 122 debug debugLog("(name: %0.8X )",m.name.ptr);122 debug debugLog("(name: %0.8X %d)",m.name.ptr,m.name.length); 123 123 debug debugLog("(ctor: %0.8X)",cast(void*)(m.ctor)); 124 124 debug debugLog("(dtor: %0.8X)",cast(void*)(m.dtor)); … … 136 136 debug debugLog("running imported modules (%d)...",m.importedModules.length); 137 137 foreach(ModuleInfo imported; m.importedModules){ 138 debug debugLog("running: [%0.8X]",cast(void*)imported); 138 139 initModule(imported,0); 140 debug debugLog("-done."); 139 141 } 140 142 if (m.ctor) … … 150 152 debug debugLog("running imported modules (%d)...",m.importedModules.length); 151 153 foreach(ModuleInfo imported; m.importedModules){ 154 debug debugLog("running: [%0.8X]",cast(void*)imported); 152 155 initModule(imported,1); 156 debug debugLog("-done."); 153 157 } 154 158 } 155 159 } 160 161 alias ModuleInfo[DynamicModule] ModuleSet; 156 162 157 163 /** … … 162 168 163 169 The parameter canSelfResolve is passed as 'true' for registraion variants of link 164 routines 165 */ 166 public void link(DynamicModule mod,bool canSelfResolve=false){ 170 routines. 171 172 moduleSet a set of modules that need initalization following the link pass. 173 */ 174 public void link(DynamicModule mod, inout ModuleSet moduleSet, bool canSelfResolve=false){ 175 uint i; 176 167 177 //protect against infinite recursion here by returning early 168 178 //by this, we count on the module being resolved further up the call stack … … 174 184 175 185 auto moduleSymbols = mod.getSymbols(); 176 for( uinti=0; i<moduleSymbols.length; i++){186 for(i=0; i<moduleSymbols.length; i++){ 177 187 auto symbol = &(moduleSymbols[i]); 178 188 … … 181 191 foreach(lib; this.libraries){ 182 192 auto libMod = lib.getModuleForSymbol(symbol.name); 183 if(libMod ){193 if(libMod && libMod != mod){ 184 194 if(!libMod.isResolved()){ 185 this.link(libMod, true);195 this.link(libMod,moduleSet,true); 186 196 } 187 197 auto otherSymbol = libMod.getSymbol(symbol.name); … … 204 214 205 215 if(canSelfResolve){ 206 foreach(sym; mod.getSymbols){ 207 if(sym.type == SymbolType.Weak) sym.type = SymbolType.Strong; 216 for(i=0; i<moduleSymbols.length; i++){ 217 auto symbol = &(moduleSymbols[i]); 218 if(symbol.type == SymbolType.Weak) symbol.type = SymbolType.Strong; 208 219 } 209 220 } … … 218 229 } 219 230 220 // dig up the ModuleInfo (if applicable) and initalize it! 221 foreach(sym; mod.getSymbols){ 222 if(!sym.address) continue; 223 if(getDemangleType(sym.name) == DemangleType.ModuleInfo){ 224 // found it, now get it and run the constructor 225 ModuleInfo moduleInfo = cast(ModuleInfo)(sym.address); 226 debug debugLog("init! %s %s %0.8X",sym.name,sym.getTypeName,sym.address); 227 initModule(moduleInfo,0); 228 debug debugLog("init done."); 229 break; 231 // dig up the ModuleInfo (if applicable) and store it for later use. 232 if(!(mod in moduleSet)){ 233 debug debugLog("looking for: %s","__ModuleInfo_" ~ mod.getRawNamespace); 234 auto sym = mod.getSymbol("__ModuleInfo_" ~ mod.getRawNamespace); 235 if(sym.address != null){ 236 debug debugLog("Found moduleinfo for %s at [%0.8X] %s",mod.getNamespace,sym.address,sym.name); 237 moduleSet[mod] = cast(ModuleInfo)(sym.address); 230 238 } 231 239 } … … 246 254 Linker linker; 247 255 248 linker. add(lib); // add to xref first256 linker.register(lib); // add to xref first 249 257 linker.link(lib); // link in the library and its aggregate modules 250 258 --- 251 259 */ 252 260 public void link(DynamicLibrary lib){ 261 ModuleSet moduleSet; 262 263 // link 253 264 foreach(DynamicModule mod; lib.getModules){ 254 this.link(mod); 265 this.link(mod,moduleSet); 266 } 267 // init 268 foreach(mod,moduleInfo; moduleSet){ 269 debug debugLog("running %s init at [%0.8X]",mod.getName,cast(void*)moduleInfo); 270 this.initModule(moduleInfo,0); 255 271 } 256 272 } trunk/ddl/Mangle.d
r221 r224 65 65 uint i=0; 66 66 uint last=0; 67 result ~= "_D";68 67 while(i < text.length){ 69 68 if(text[i] == '.'){ trunk/ddl/insitu/InSituModule.d
r218 r224 37 37 38 38 public char[] getName(){ 39 return " ";39 return "<in-situ>"; 40 40 } 41 41 trunk/ddl/omf/OMFBinary.d
r220 r224 121 121 } 122 122 123 void parse(inout EXTDEF[] externs, inout FixupTarget[] targets,OMFReader reader){123 void parse(inout EXTDEF[] externs,OMFReader reader){ 124 124 while(reader.hasMore()){ 125 125 EXTDEF extdef; 126 126 extdef.parse(reader); 127 externs ~= extdef; 128 129 FixupTarget target; 130 target.type = FixupTarget.EXTDEF; 131 target.index = externs.length-1; 132 targets ~= target; 127 externs ~= extdef; 133 128 } 134 129 } … … 154 149 } 155 150 156 void parse(inout PUBDEF[] publics, inout FixupTarget[] targets,OMFReader reader){151 void parse(inout PUBDEF[] publics,OMFReader reader){ 157 152 OMFIndex groupIndex; 158 153 OMFIndex segmentIndex; … … 181 176 182 177 publics ~= pub; 183 184 FixupTarget target;185 target.type = FixupTarget.PUBDEF;186 target.index = publics.length-1;187 targets ~= target;188 178 } 189 179 } … … 366 356 //not used 367 357 } 368 }369 370 371 /**372 Defines a mapping between a record and a logical fixup target index.373 */374 struct FixupTarget{375 enum: ubyte{376 PUBDEF,377 CEXTDEF,378 COMDAT,379 EXTDEF380 }381 ubyte type;382 uint index;383 358 } 384 359 … … 710 685 } 711 686 712 void parse(inout CEXTDEF[] commonExterns, inout FixupTarget[] targets,OMFReader reader){687 void parse(inout CEXTDEF[] commonExterns,OMFReader reader){ 713 688 while(reader.hasMore()){ 714 689 CEXTDEF def; 715 690 def.parse(reader); 716 691 commonExterns ~= def; 717 718 FixupTarget target;719 target.type = FixupTarget.CEXTDEF;720 target.index = commonExterns.length-1;721 targets ~= target;722 692 } 723 693 } … … 774 744 } 775 745 776 void parse(inout COMDAT[] commonData,inout FixupData fixupData, inout FixupTarget[] targets,OMFReader reader){746 void parse(inout COMDAT[] commonData,inout FixupData fixupData,OMFReader reader){ 777 747 while(reader.hasMore()){ 778 748 COMDAT data; … … 784 754 fixupData.offset = data.enumDataOffset; 785 755 fixupData.destNameIndex = data.nameIndex; 786 787 if(!data.isContinuation){788 FixupTarget target;789 target.type = FixupTarget.COMDAT;790 target.index = commonData.length-1;791 targets ~= target;792 }793 756 } 794 757 } … … 898 861 LString libraryName; 899 862 LString[] names; 900 FixupTarget[] targets;901 863 902 864 // comment sub data … … 942 904 names.length = names.length+1; 943 905 externs.length = externs.length+1; 944 targets.length = targets.length+1;945 906 946 907 while(mainReader.hasMore()){ … … 967 928 968 929 case 0x8C: //EXTDEF 969 .parse(externs, targets,reader);930 .parse(externs,reader); 970 931 break; 971 932 972 933 case 0x90: //PUBDEF 973 .parse(publics, targets,reader);934 .parse(publics,reader); 974 935 break; 975 936 … … 1007 968 1008 969 case 0xBC: //CEXTDEF 1009 .parse(communalExterns, targets,reader);970 .parse(communalExterns,reader); 1010 971 break; 1011 972 1012 973 case 0xC2: //COMDAT 1013 .parse(communalData,fixupData, targets,reader);974 .parse(communalData,fixupData,reader); 1014 975 break; 1015 976 … … 1275 1236 } 1276 1237 } 1277 1278 result ~= "Fixup Targets:\n";1279 foreach(idx,target; targets) with(target){1280 char[] targetTypeName;1281 switch(type){1282 case FixupTarget.COMDAT: targetTypeName = "COMDAT"; break;1283 case FixupTarget.PUBDEF: targetTypeName = "PUBDEF"; break;1284 case FixupTarget.EXTDEF: targetTypeName = "EXTDEF"; break;1285 case FixupTarget.CEXTDEF: targetTypeName = "CEXTDEF"; break;1286 }1287 result ~= sprint(" %d: %s %d\n",idx,targetTypeName,index);1288 }1289 1238 1290 1239 return result; trunk/ddl/omf/OMFModule.d
r223 r224 35 35 36 36 private import mango.io.model.IReader; 37 private import mango.text.Text; 37 38 38 39 version(Windows){ … … 49 50 bool isExternStyleFixup; 50 51 bool isSegmentRelative; 51 void* destAddress; 52 ExportSymbolPtr destSymbol; 53 uint destSymbolOffset; 54 void* destSegmentAddress; 52 55 } 53 56 … … 91 94 foreach(idx,fix; fixups) with(fix){ 92 95 uint fixupValue; 96 uint destAddress; 97 98 // get the dest address 99 if(destSymbol){ 100 destAddress = cast(uint)destSymbol.address + destSymbolOffset; 101 } 102 else{ 103 destAddress = cast(uint)destSegmentAddress; 104 } 93 105 94 106 // get the fixup value … … 104 116 fixupValue = cast(uint)(segmentImages[targetIndex].data.ptr); 105 117 } 118 debug debugLog("fixup dest [%0.8X] = fixupValue [%0.8X] rel:%d",destAddress,fixupValue,cast(uint)isSegmentRelative); 106 119 107 120 // apply the fixup value … … 116 129 } 117 130 else{ // self relative 118 *cast(uint*)destAddress += fixupValue; 119 } 131 *cast(uint*)destAddress += fixupValue; 132 } 133 134 debug debugLog("\tfixed to: [%0.8X]",*cast(uint*)destAddress); 120 135 } 121 136 this.fixups = remainingFixups; … … 141 156 //TODO: alter this to zero in on D namespaces and C/asm namespaces 142 157 this.moduleName = binary.libraryName; 158 this.moduleName = Text.replace(this.moduleName,'\\','.'); 143 159 //debug debugLog(moduleName); 144 160 … … 378 394 newFix.isExternStyleFixup = fix.isExternStyleFixup; 379 395 newFix.targetIndex = fix.targetIndex; 396 newFix.destSymbolOffset = 0; 397 newFix.destSymbol = null; 398 newFix.destSegmentAddress = null; 380 399 381 400 if(fix.destNameIndex > 0){ 382 401 //TODO: this assumes that these fixups are strong - needs to be loosened so that weak symbols can be resolved (?) 383 newFix.destAddress = symbolXref[binary.names[fix.destNameIndex]].address + fix.destOffset; 402 newFix.destSymbol = symbolXref[binary.names[fix.destNameIndex]]; 403 newFix.destSymbolOffset = fix.destOffset; 384 404 } 385 405 else{ 386 newFix.dest Address = cast(uint*)(segmentImages[fix.destSegmentIndex].data.ptr + fix.destOffset);406 newFix.destSegmentAddress = cast(uint*)(segmentImages[fix.destSegmentIndex].data.ptr + fix.destOffset); 387 407 } 388 408 fixups ~= newFix; … … 422 442 char[] ext = isExternStyleFixup ? "externStyle" : "segmentStyle"; 423 443 424 result ~= sprint(" %d: % 0.8X %s %s",idx,destAddress,rel,ext);425 426 if( isExternStyleFixup){427 result ~= sprint(" | %s \n",symbols[targetIndex-1].name);444 result ~= sprint(" %d: %s %s",idx,rel,ext); 445 446 if(destSymbol){ 447 result ~= sprint(" | %s [%0.8X]",destSymbol.name,cast(uint)destSymbol.address+destSymbolOffset); 428 448 } 429 449 else{ 430 result ~= sprint(" | segment #%d\n",targetIndex); 431 } 450 result ~= sprint(" | [%0.8X]",cast(uint)destSegmentAddress); 451 } 452 453 if(isExternStyleFixup){ 454 result ~= sprint(" | %s [%0.8X]",symbols[targetIndex-1].name,symbols[targetIndex-1].address); 455 } 456 else{ 457 result ~= sprint(" | segment #%d [%0.8X]",targetIndex,segmentImages[targetIndex].data.ptr); 458 } 459 result ~= "\n"; 432 460 } 433 461 } trunk/test/testconfig.d
r223 r224 26 26 27 27 /// path to DMD directory - change as needed 28 static char[] dmdPath = " d:\\programs\\dmd\\";28 static char[] dmdPath = "c:\\programs\\dmd\\"; 29 29 30 30 /// path to DMC linker and utils - change as needed 31 static char[] dmPath = " d:\\programs\\dm\\";31 static char[] dmPath = "c:\\programs\\dm\\"; trunk/test/testmodule.d
r221 r224 50 50 } 51 51 public void callable() { 52 writefln("In externally callable function, A=", a);52 printf("In externally callable function, A=%d\n", a); 53 53 } 54 54 55 55 private void test(){ 56 writefln("A = %d",a);56 printf("A = %d\n",a); 57 57 } 58 58 59 59 static this(){ 60 writefln("TestClass initialized"); 60 printf("writefln: [%0.8X]\n",&writefln); 61 //writefln(""); 62 } 63 64 public void exceptionTest(){ 65 throw new Exception("From - test.testmodule.TestClass.exceptionTest()"); 61 66 } 62 67 } 63 68 69 uint intialized = false; 70 64 71 static this(){ 65 72 printf("testmodule initalized\n"); 73 intialized = true; 66 74 } 67 75 … … 100 108 } 101 109 110 public void exceptionTest(){ 111 printf("Throwing..."); 112 throw new Exception("From - test.testmodule.exceptionTest()"); 113 printf("You shouldn't be here. :(\n"); 114 } 115 116 public void exceptionTest2(){ 117 try{ 118 exceptionTest(); 119 } 120 catch(Exception e){ 121 printf("That worked alright.\n"); 122 } 123 printf("Done with exceptionTest2\n"); 124 } 102 125 103 126 /* Eratosthenes Sieve prime number calculation. */ trunk/utils/bless_bn.d
r222 r224 2 2 // This file is automatically maintained by the BUILD utility, 3 3 // Please refrain from manually editing it. 4 long auto_build_number = 66 0;4 long auto_build_number = 662; trunk/utils/ddlinfo_bn.d
r222 r224 2 2 // This file is automatically maintained by the BUILD utility, 3 3 // Please refrain from manually editing it. 4 long auto_build_number = 71 0;4 long auto_build_number = 713; trunk/utils/insitu_bn.d
r222 r224 2 2 // This file is automatically maintained by the BUILD utility, 3 3 // Please refrain from manually editing it. 4 long auto_build_number = 65 7;4 long auto_build_number = 659;
