]> git.localhorst.tv Git - l2e.git/blob - src/loader/ObjectFile.cpp
new object file format in compiler
[l2e.git] / src / loader / ObjectFile.cpp
1 #include "ObjectFile.h"
2
3 #include <stdexcept>
4
5 using std::runtime_error;
6
7
8 namespace loader {
9
10 ObjectFileHeader::ObjectFileHeader()
11 : versionId(FORMAT_ID)
12 , exportsBegin(0)
13 , exportsEnd(0)
14 , externalsBegin(0)
15 , externalsEnd(0)
16 , objectsBegin(0)
17 , objectsEnd(0)
18 , arraysBegin(0)
19 , arraysEnd(0) {
20         ident[0] = 'L';
21         ident[1] = '2';
22         ident[2] = 'E';
23         ident[3] = '\n';
24 }
25
26 void ObjectFileHeader::IntegrityCheck(unsigned int fsize) const {
27         if (ident[0] != 'L'
28                         || ident[1] != '2'
29                         || ident[2] != 'E'
30                         || ident[3] != '\n') {
31                 throw runtime_error("magic bytes mismatch");
32         }
33         if (versionId != FORMAT_ID) {
34                 throw runtime_error("format ID mismatch");
35         }
36         if (exportsBegin < sizeof(ObjectFileHeader)
37                         || exportsBegin > fsize) {
38                 throw runtime_error("exports section out of bounds");
39         }
40         if (exportsEnd < exportsBegin
41                         || exportsEnd > fsize
42                         || (exportsEnd - exportsBegin) % sizeof(Export) != 0) {
43                 throw runtime_error("bogus exports section end");
44         }
45         if (externalsBegin < sizeof(ObjectFileHeader)
46                         || externalsBegin >= fsize) {
47                 throw runtime_error("externals section out of bounds");
48         }
49         if (externalsEnd < externalsBegin
50                         || externalsEnd > fsize
51                         || (externalsEnd - externalsBegin) % sizeof(External) != 0) {
52                 throw runtime_error("bogus externals section end");
53         }
54         if (objectsBegin < sizeof(ObjectFileHeader)
55                         || objectsBegin >= fsize
56                         || objectsEnd < objectsBegin
57                         || objectsEnd > fsize) {
58                 throw runtime_error("objects section out of bounds");
59         }
60         if (arraysBegin < sizeof(ObjectFileHeader)
61                         || arraysBegin >= fsize
62                         || arraysEnd < arraysBegin
63                         || arraysEnd > fsize) {
64                 throw runtime_error("arrays section out of bounds");
65         }
66 }
67
68 Export *ObjectFileHeader::ExportsBegin() {
69         char *data = reinterpret_cast<char *>(this);
70         return reinterpret_cast<Export *>(data + exportsBegin);
71 }
72
73 Export *ObjectFileHeader::ExportsEnd() {
74         char *data = reinterpret_cast<char *>(this);
75         return reinterpret_cast<Export *>(data + exportsEnd);
76 }
77
78 External *ObjectFileHeader::ExternalsBegin() {
79         char *data = reinterpret_cast<char *>(this);
80         return reinterpret_cast<External *>(data + externalsBegin);
81 }
82
83 External *ObjectFileHeader::ExternalsEnd() {
84         char *data = reinterpret_cast<char *>(this);
85         return reinterpret_cast<External *>(data + externalsEnd);
86 }
87
88 Object *ObjectFileHeader::ObjectsBegin() {
89         char *data = reinterpret_cast<char *>(this);
90         return reinterpret_cast<Object *>(data + objectsBegin);
91 }
92
93 Object *ObjectFileHeader::ObjectsEnd() {
94         char *data = reinterpret_cast<char *>(this);
95         return reinterpret_cast<Object *>(data + objectsEnd);
96 }
97
98 Array *ObjectFileHeader::ArraysBegin() {
99         char *data = reinterpret_cast<char *>(this);
100         return reinterpret_cast<Array *>(data + arraysBegin);
101 }
102
103 Array *ObjectFileHeader::ArraysEnd() {
104         char *data = reinterpret_cast<char *>(this);
105         return reinterpret_cast<Array *>(data + arraysEnd);
106 }
107
108
109 char *Object::RawObject() {
110         return reinterpret_cast<char *>(this) + sizeof(Object);
111 }
112
113 Object *Object::Next() {
114         return reinterpret_cast<Object *>(RawObject() + size);
115 }
116
117
118 char *Array::Data() {
119         return reinterpret_cast<char *>(this) + sizeof(Array);
120 }
121
122 Array *Array::Next() {
123         return reinterpret_cast<Array *>(Data() + size);
124 }
125
126 }