]> git.llucax.com Git - software/druntime.git/blob - src/compiler/dmd/minit.asm
Fixed a few mistakes regarding invariance, etc, between D1 and D2.
[software/druntime.git] / src / compiler / dmd / minit.asm
1 ;_ minit.asm\r
2 ; Written by Walter Bright\r
3 ; Digital Mars\r
4 ; http://www.digitalmars.com/d/\r
5 ; Placed into the Public Domain\r
6 \r
7 include macros.asm\r
8 \r
9 ifdef _WIN32\r
10   DATAGRP      EQU     FLAT\r
11 else\r
12   DATAGRP      EQU     DGROUP\r
13 endif\r
14 \r
15 ; Provide a default resolution for weak extern records, no way in C\r
16 ; to define an omf symbol with a specific value\r
17 public __nullext\r
18 __nullext   equ 0\r
19 \r
20     extrn   __moduleinfo_array:near\r
21 \r
22 ; This bit of assembler is needed because, from C or D, one cannot\r
23 ; specify the names of data segments. Why does this matter?\r
24 ; All the ModuleInfo pointers are placed into a segment named 'FM'.\r
25 ; The order in which they are placed in 'FM' is arbitrarily up to the linker.\r
26 ; In order to walk all the pointers, we need to be able to find the\r
27 ; beginning and the end of the 'FM' segment.\r
28 ; This is done by bracketing the 'FM' segment with two other, empty,\r
29 ; segments named 'FMB' and 'FME'. Since this module is the only one that\r
30 ; ever refers to 'FMB' and 'FME', we get to control the order in which\r
31 ; these segments appear relative to 'FM' by using a GROUP statement.\r
32 ; So, we have in memory:\r
33 ;   FMB empty segment\r
34 ;   FM  contains all the pointers\r
35 ;   FME empty segment\r
36 ; and finding the limits of FM is as easy as taking the address of FMB\r
37 ; and the address of FME.\r
38 \r
39 ; These segments bracket FM, which contains the list of ModuleInfo pointers\r
40 FMB     segment dword use32 public 'DATA'\r
41 FMB     ends\r
42 FM      segment dword use32 public 'DATA'\r
43 FM      ends\r
44 FME     segment dword use32 public 'DATA'\r
45 FME     ends\r
46 \r
47 ; This leaves room in the _fatexit() list for _moduleDtor()\r
48 XOB     segment dword use32 public 'BSS'\r
49 XOB     ends\r
50 XO      segment dword use32 public 'BSS'\r
51     dd  ?\r
52 XO      ends\r
53 XOE     segment dword use32 public 'BSS'\r
54 XOE     ends\r
55 \r
56 DGROUP         group   FMB,FM,FME\r
57 \r
58     begcode minit\r
59 \r
60 ; extern (C) void _minit();\r
61 ; Converts array of ModuleInfo pointers to a D dynamic array of them,\r
62 ; so they can be accessed via D.\r
63 ; Result is written to:\r
64 ; extern (C) ModuleInfo[] _moduleinfo_array;\r
65 \r
66     public  __minit\r
67 __minit proc    near\r
68     mov EDX,offset DATAGRP:FMB\r
69     mov EAX,offset DATAGRP:FME\r
70     mov dword ptr __moduleinfo_array+4,EDX\r
71     sub EAX,EDX         ; size in bytes of FM segment\r
72     shr EAX,2           ; convert to array length\r
73     mov dword ptr __moduleinfo_array,EAX\r
74     ret\r
75 __minit endp\r
76 \r
77     endcode minit\r
78 \r
79     end\r