Mercurial > projects > ddmd
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++) |