comparison dmd/Module.d @ 179:cd48cb899aee

Updated to dmd2.040
author korDen
date Sun, 17 Oct 2010 20:56:07 +0400
parents e3afd1303184
children b0d41ff5e0df
comparison
equal deleted inserted replaced
178:e3afd1303184 179:cd48cb899aee
6 import dmd.backend.TYM; 6 import dmd.backend.TYM;
7 import dmd.Array; 7 import dmd.Array;
8 import dmd.StaticDtorDeclaration; 8 import dmd.StaticDtorDeclaration;
9 import dmd.Scope; 9 import dmd.Scope;
10 import dmd.Id; 10 import dmd.Id;
11 import dmd.SharedStaticCtorDeclaration;
12 import dmd.SharedStaticDtorDeclaration;
11 import dmd.Import; 13 import dmd.Import;
12 import dmd.ClassDeclaration; 14 import dmd.ClassDeclaration;
13 import dmd.ModuleDeclaration; 15 import dmd.ModuleDeclaration;
14 import dmd.File; 16 import dmd.File;
15 import dmd.Identifier; 17 import dmd.Identifier;
949 global.eictor = null; 951 global.eictor = null;
950 global.ictorlocalgot = null; 952 global.ictorlocalgot = null;
951 global.ector = null; 953 global.ector = null;
952 global.ectorgates.setDim(0); 954 global.ectorgates.setDim(0);
953 global.edtor = null; 955 global.edtor = null;
956 global.esharedctor = null;
957 global.esharedctorgates.setDim(0);
958 global.eshareddtor = null;
954 global.etest = null; 959 global.etest = null;
955 global.dtorcount = 0; 960 global.dtorcount = 0;
961 global.shareddtorcount = 0;
956 962
957 if (doppelganger) 963 if (doppelganger)
958 { 964 {
959 /* Generate a reference to the moduleinfo, so the module constructors 965 /* Generate a reference to the moduleinfo, so the module constructors
960 * and destructors get linked in. 966 * and destructors get linked in.
961 */ 967 */
962 Module m = cast(Module)aimports.data[0]; 968 Module m = cast(Module)aimports.data[0];
963 assert(m); 969 assert(m);
964 if (m.sictor || m.sctor || m.sdtor) 970 if (m.sictor || m.sctor || m.sdtor || m.ssharedctor || m.sshareddtor)
965 { 971 {
966 Symbol* s = m.toSymbol(); 972 Symbol* s = m.toSymbol();
967 //objextern(s); 973 //objextern(s);
968 //if (!s.Sxtrnnum) objextdef(s.Sident); 974 //if (!s.Sxtrnnum) objextdef(s.Sident);
969 if (!s.Sxtrnnum) 975 if (!s.Sxtrnnum)
1055 global.eictor = el_combine(e, global.eictor); 1061 global.eictor = el_combine(e, global.eictor);
1056 global.ictorlocalgot = global.localgot; 1062 global.ictorlocalgot = global.localgot;
1057 } 1063 }
1058 1064
1059 // If coverage / static constructor / destructor / unittest calls 1065 // If coverage / static constructor / destructor / unittest calls
1060 if (global.eictor || global.ector || global.ectorgates.dim || global.edtor || global.etest) 1066 if (global.eictor || global.ector || global.ectorgates.dim || global.edtor || global.esharedctor || global.esharedctorgates.dim || global.eshareddtor || global.etest)
1061 { 1067 {
1062 /* t will be the type of the functions generated: 1068 /* t will be the type of the functions generated:
1063 * extern (C) void func(); 1069 * extern (C) void func();
1064 */ 1070 */
1065 type* t = type_alloc(TYM.TYnfunc); 1071 type* t = type_alloc(TYM.TYnfunc);
1116 b.BC = BC.BCret; 1122 b.BC = BC.BCret;
1117 b.Belem = global.edtor; 1123 b.Belem = global.edtor;
1118 sdtor.Sfunc.Fstartblock = b; 1124 sdtor.Sfunc.Fstartblock = b;
1119 writefunc(sdtor); 1125 writefunc(sdtor);
1120 } 1126 }
1127
1128 if (global.esharedctor || global.esharedctorgates.dim)
1129 {
1130 global.localgot = null;
1131 ssharedctor = toSymbolX("__modsharedctor", SCglobal, t, moddeco);
1132 cstate.CSpsymtab = &ssharedctor.Sfunc.Flocsym;
1133
1134 for (int i = 0; i < global.esharedctorgates.dim; i++)
1135 {
1136 SharedStaticDtorDeclaration f = cast(SharedStaticDtorDeclaration)global.esharedctorgates.data[i];
1137
1138 Symbol* s = f.vgate.toSymbol();
1139 elem* e = el_var(s);
1140 e = el_bin(OPaddass, TYint, e, el_long(TYint, 1));
1141 global.esharedctor = el_combine(global.esharedctor, e);
1142 }
1143
1144 block* b = block_calloc();
1145 b.BC = BCret;
1146 b.Belem = global.esharedctor;
1147 ssharedctor.Sfunc.Fstartblock = b;
1148 writefunc(ssharedctor);
1149 version (STATICCTOR) {
1150 obj_staticctor(ssharedctor, shareddtorcount, 1);
1151 }
1152 }
1153
1154 if (global.eshareddtor)
1155 {
1156 global.localgot = null;
1157 sshareddtor = toSymbolX("__modshareddtor", SCglobal, t, moddeco);
1158
1159 block *b = block_calloc();
1160 b.BC = BCret;
1161 b.Belem = global.eshareddtor;
1162 sshareddtor.Sfunc.Fstartblock = b;
1163 writefunc(sshareddtor);
1164 }
1165
1121 1166
1122 if (global.etest) 1167 if (global.etest)
1123 { 1168 {
1124 global.localgot = null; 1169 global.localgot = null;
1125 stest = toSymbolX("__modtest", SC.SCglobal, t, moddeco); 1170 stest = toSymbolX("__modtest", SC.SCglobal, t, moddeco);
1290 1335
1291 /****************************************** 1336 /******************************************
1292 * Run semantic() on deferred symbols. 1337 * Run semantic() on deferred symbols.
1293 */ 1338 */
1294 1339
1295 void runDeferredSemantic() 1340 static void runDeferredSemantic()
1296 { 1341 {
1342 if (global.dprogress == 0)
1343 return;
1344
1297 if (global.nested) 1345 if (global.nested)
1298 return; 1346 return;
1299 //if (deferred.dim) printf("+Module.runDeferredSemantic('%s'), len = %d\n", toChars(), deferred.dim); 1347 //if (deferred.dim) printf("+Module.runDeferredSemantic('%s'), len = %d\n", toChars(), deferred.dim);
1300 global.nested++; 1348 global.nested++;
1301 1349
1350 auto deferred = global.deferred;
1351
1302 size_t len; 1352 size_t len;
1303
1304 auto deferred = global.deferred;
1305
1306 do 1353 do
1307 { 1354 {
1308 global.dprogress = 0; 1355 global.dprogress = 0;
1309 len = deferred.dim; 1356 len = deferred.dim;
1310 if (!len) 1357 if (!len)
1378 uint* covb; // bit array of valid code line numbers 1425 uint* covb; // bit array of valid code line numbers
1379 1426
1380 Symbol* sictor; // module order independent constructor 1427 Symbol* sictor; // module order independent constructor
1381 Symbol* sctor; // module constructor 1428 Symbol* sctor; // module constructor
1382 Symbol* sdtor; // module destructor 1429 Symbol* sdtor; // module destructor
1430 Symbol* ssharedctor; // module shared constructor
1431 Symbol* sshareddtor; // module shared destructor
1383 Symbol* stest; // module unit test 1432 Symbol* stest; // module unit test
1384 1433
1385 Symbol* sfilename; // symbol for filename 1434 Symbol* sfilename; // symbol for filename
1386 1435
1387 Symbol* massert; // module assert function 1436 Symbol* massert; // module assert function
1524 1573
1525 //dumpSymbol(msym); 1574 //dumpSymbol(msym);
1526 1575
1527 uint offset; 1576 uint offset;
1528 version (DMDV2) { 1577 version (DMDV2) {
1529 uint sizeof_ModuleInfo = 18 * PTRSIZE; 1578 uint sizeof_ModuleInfo = 16 * PTRSIZE;
1530 } else { 1579 } else {
1531 uint sizeof_ModuleInfo = 14 * PTRSIZE; 1580 uint sizeof_ModuleInfo = 14 * PTRSIZE;
1532 } 1581 }
1582
1583 version (MODULEINFO_IS_STRUCT) {} else {
1584 sizeof_ModuleInfo -= 2 * PTRSIZE;
1585 }
1586 //printf("moduleinfo size = x%x\n", sizeof_ModuleInfo);
1533 1587
1534 ////////////////////////////////////////////// 1588 //////////////////////////////////////////////
1535 1589
1536 csym.Sclass = SC.SCglobal; 1590 csym.Sclass = SC.SCglobal;
1537 1591
1548 void *ctor; 1602 void *ctor;
1549 void *dtor; 1603 void *dtor;
1550 void *unitTest; 1604 void *unitTest;
1551 const(MemberInfo[]) function(string) xgetMembers; // module getMembers() function 1605 const(MemberInfo[]) function(string) xgetMembers; // module getMembers() function
1552 void *ictor; 1606 void *ictor;
1553 void*[4] reserved; 1607 void *sharedctor;
1608 void *shareddtor;
1609 uint index;
1610 void*[1] reserved;
1554 } 1611 }
1555 */ 1612 */
1556 dt_t* dt = null; 1613 dt_t* dt = null;
1557 1614 version (MODULEINFO_IS_STRUCT) {} else {
1558 if (global.moduleinfo) 1615 if (global.moduleinfo)
1559 dtxoff(&dt, global.moduleinfo.toVtblSymbol(), 0, TYM.TYnptr); // vtbl for ModuleInfo 1616 dtxoff(&dt, global.moduleinfo.toVtblSymbol(), 0, TYM.TYnptr); // vtbl for ModuleInfo
1560 else 1617 else
1561 { 1618 {
1562 //printf("moduleinfo is null\n"); 1619 //printf("moduleinfo is null\n");
1563 dtdword(&dt, 0); // BUG: should be an assert() 1620 dtdword(&dt, 0); // BUG: should be an assert()
1564 } 1621 }
1565 dtdword(&dt, 0); // monitor 1622 dtdword(&dt, 0); // monitor
1566 1623 }
1567 // name[] 1624 // name[]
1568 string name = toPrettyChars(); 1625 string name = toPrettyChars();
1569 size_t namelen = name.length; 1626 size_t namelen = name.length;
1570 dtdword(&dt, namelen); 1627 dtdword(&dt, namelen);
1571 dtabytes(&dt, TYM.TYnptr, 0, namelen + 1, toStringz(name)); 1628 dtabytes(&dt, TYM.TYnptr, 0, namelen + 1, toStringz(name));
1604 if (needmoduleinfo) 1661 if (needmoduleinfo)
1605 dtdword(&dt, 8|0); // flags (4 means MIstandalone) 1662 dtdword(&dt, 8|0); // flags (4 means MIstandalone)
1606 else 1663 else
1607 dtdword(&dt, 8|4); // flags (4 means MIstandalone) 1664 dtdword(&dt, 8|4); // flags (4 means MIstandalone)
1608 1665
1609 if (sctor) 1666 if (ssharedctor)
1610 dtxoff(&dt, sctor, 0, TYM.TYnptr); 1667 dtxoff(&dt, ssharedctor, 0, TYnptr);
1611 else 1668 else
1612 dtdword(&dt, 0); 1669 dtdword(&dt, 0);
1613 1670
1614 if (sdtor) 1671 if (sshareddtor)
1615 dtxoff(&dt, sdtor, 0, TYM.TYnptr); 1672 dtxoff(&dt, sshareddtor, 0, TYnptr);
1616 else 1673 else
1617 dtdword(&dt, 0); 1674 dtdword(&dt, 0);
1618 1675
1619 if (stest) 1676 if (stest)
1620 dtxoff(&dt, stest, 0, TYM.TYnptr); 1677 dtxoff(&dt, stest, 0, TYM.TYnptr);
1633 dtxoff(&dt, sictor, 0, TYM.TYnptr); 1690 dtxoff(&dt, sictor, 0, TYM.TYnptr);
1634 else 1691 else
1635 dtdword(&dt, 0); 1692 dtdword(&dt, 0);
1636 1693
1637 version (DMDV2) { 1694 version (DMDV2) {
1638 // void*[4] reserved; 1695 if (sctor)
1639 dtdword(&dt, 0); 1696 dtxoff(&dt, sctor, 0, TYnptr);
1640 dtdword(&dt, 0); 1697 else
1641 dtdword(&dt, 0); 1698 dtdword(&dt, 0);
1699
1700 if (sdtor)
1701 dtxoff(&dt, sdtor, 0, TYnptr);
1702 else
1703 dtdword(&dt, 0);
1704
1705 dtdword(&dt, 0); // index
1706
1707 // void*[1] reserved;
1642 dtdword(&dt, 0); 1708 dtdword(&dt, 0);
1643 } 1709 }
1644 ////////////////////////////////////////////// 1710 //////////////////////////////////////////////
1645 1711
1646 for (int i = 0; i < aimports.dim; i++) 1712 for (int i = 0; i < aimports.dim; i++)