blob: 7ee46cc07fd16d025b4a3bb0bdf83490ea9c726f [file] [log] [blame]
Nick Kledzik7735a7d2012-01-04 23:58:17 +00001//===- Core/YamlKeyValues.cpp - Reads YAML --------------------------------===//
2//
3// The LLVM Linker
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include <string.h>
11
12#include "YamlKeyValues.h"
13
14#include "llvm/Support/ErrorHandling.h"
15
16namespace lld {
17namespace yaml {
18
19
20const char* const KeyValues::nameKeyword = "name";
Nick Kledzik49d6cc82012-02-15 00:38:09 +000021const char* const KeyValues::refNameKeyword = "ref-name";
Nick Kledzik7735a7d2012-01-04 23:58:17 +000022const char* const KeyValues::definitionKeyword = "definition";
Nick Kledzikf4fb2c52012-01-11 01:06:19 +000023const char* const KeyValues::scopeKeyword = "scope";
Nick Kledzik7735a7d2012-01-04 23:58:17 +000024const char* const KeyValues::contentTypeKeyword = "type";
25const char* const KeyValues::deadStripKindKeyword = "dead-strip";
26const char* const KeyValues::sectionChoiceKeyword = "section-choice";
Nick Kledzikf4fb2c52012-01-11 01:06:19 +000027const char* const KeyValues::interposableKeyword = "interposable";
28const char* const KeyValues::mergeKeyword = "merge";
Nick Kledzik7735a7d2012-01-04 23:58:17 +000029const char* const KeyValues::isThumbKeyword = "is-thumb";
30const char* const KeyValues::isAliasKeyword = "is-alias";
31const char* const KeyValues::sectionNameKeyword = "section-name";
32const char* const KeyValues::contentKeyword = "content";
Nick Kledzik6bc04c62012-02-22 21:56:59 +000033const char* const KeyValues::loadNameKeyword = "load-name";
Nick Kledzik7735a7d2012-01-04 23:58:17 +000034const char* const KeyValues::sizeKeyword = "size";
Nick Kledzik6bc04c62012-02-22 21:56:59 +000035const char* const KeyValues::valueKeyword = "value";
Nick Kledzik49d6cc82012-02-15 00:38:09 +000036const char* const KeyValues::fixupsKeyword = "fixups";
Nick Kledzik23384e82012-02-07 02:59:54 +000037const char* const KeyValues::permissionsKeyword = "permissions";
Nick Kledzik6bc04c62012-02-22 21:56:59 +000038const char* const KeyValues::canBeNullKeyword = "can-be-null";
Nick Kledzik49d6cc82012-02-15 00:38:09 +000039const char* const KeyValues::fixupsKindKeyword = "kind";
40const char* const KeyValues::fixupsOffsetKeyword = "offset";
41const char* const KeyValues::fixupsTargetKeyword = "target";
42const char* const KeyValues::fixupsAddendKeyword = "addend";
43
Nick Kledzik7735a7d2012-01-04 23:58:17 +000044
45
Nick Kledzikf4fb2c52012-01-11 01:06:19 +000046const DefinedAtom::Definition KeyValues::definitionDefault = Atom::definitionRegular;
47const DefinedAtom::Scope KeyValues::scopeDefault = DefinedAtom::scopeTranslationUnit;
48const DefinedAtom::ContentType KeyValues::contentTypeDefault = DefinedAtom::typeData;
49const DefinedAtom::DeadStripKind KeyValues::deadStripKindDefault = DefinedAtom::deadStripNormal;
50const DefinedAtom::SectionChoice KeyValues::sectionChoiceDefault = DefinedAtom::sectionBasedOnContent;
51const DefinedAtom::Interposable KeyValues::interposableDefault = DefinedAtom::interposeNo;
52const DefinedAtom::Merge KeyValues::mergeDefault = DefinedAtom::mergeNo;
53const DefinedAtom::ContentPermissions KeyValues::permissionsDefault = DefinedAtom::permR__;
Nick Kledzikf4fb2c52012-01-11 01:06:19 +000054const bool KeyValues::isThumbDefault = false;
55const bool KeyValues::isAliasDefault = false;
Nick Kledzik6bc04c62012-02-22 21:56:59 +000056const UndefinedAtom::CanBeNull KeyValues::canBeNullDefault = UndefinedAtom::canBeNullNever;
Nick Kledzik7735a7d2012-01-04 23:58:17 +000057
58
59
60
61
62struct DefinitionMapping {
Nick Kledzik23384e82012-02-07 02:59:54 +000063 const char* string;
64 Atom::Definition value;
Nick Kledzik7735a7d2012-01-04 23:58:17 +000065};
66
67static const DefinitionMapping defMappings[] = {
Nick Kledzik23384e82012-02-07 02:59:54 +000068 { "regular", Atom::definitionRegular },
69 { "absolute", Atom::definitionAbsolute },
70 { "undefined", Atom::definitionUndefined },
71 { "shared-library", Atom::definitionSharedLibrary },
Nick Kledzik7735a7d2012-01-04 23:58:17 +000072 { NULL, Atom::definitionRegular }
73};
74
75Atom::Definition KeyValues::definition(const char* s)
76{
Nick Kledzik23384e82012-02-07 02:59:54 +000077 for (const DefinitionMapping* p = defMappings; p->string != NULL; ++p) {
Nick Kledzik7735a7d2012-01-04 23:58:17 +000078 if ( strcmp(p->string, s) == 0 )
79 return p->value;
80 }
81 llvm::report_fatal_error("bad definition value");
82}
83
84const char* KeyValues::definition(Atom::Definition s) {
Nick Kledzik23384e82012-02-07 02:59:54 +000085 for (const DefinitionMapping* p = defMappings; p->string != NULL; ++p) {
Nick Kledzik7735a7d2012-01-04 23:58:17 +000086 if ( p->value == s )
87 return p->string;
88 }
89 llvm::report_fatal_error("bad definition value");
90}
91
92
93
94
95
Nick Kledzikf4fb2c52012-01-11 01:06:19 +000096struct ScopeMapping {
Nick Kledzik23384e82012-02-07 02:59:54 +000097 const char* string;
98 DefinedAtom::Scope value;
Nick Kledzikf4fb2c52012-01-11 01:06:19 +000099};
100
101static const ScopeMapping scopeMappings[] = {
Nick Kledzik23384e82012-02-07 02:59:54 +0000102 { "global", DefinedAtom::scopeGlobal },
103 { "hidden", DefinedAtom::scopeLinkageUnit },
104 { "static", DefinedAtom::scopeTranslationUnit },
Nick Kledzikf4fb2c52012-01-11 01:06:19 +0000105 { NULL, DefinedAtom::scopeGlobal }
106};
107
108DefinedAtom::Scope KeyValues::scope(const char* s)
109{
Nick Kledzik23384e82012-02-07 02:59:54 +0000110 for (const ScopeMapping* p = scopeMappings; p->string != NULL; ++p) {
Nick Kledzikf4fb2c52012-01-11 01:06:19 +0000111 if ( strcmp(p->string, s) == 0 )
112 return p->value;
113 }
114 llvm::report_fatal_error("bad scope value");
115}
116
117const char* KeyValues::scope(DefinedAtom::Scope s) {
Nick Kledzik23384e82012-02-07 02:59:54 +0000118 for (const ScopeMapping* p = scopeMappings; p->string != NULL; ++p) {
Nick Kledzikf4fb2c52012-01-11 01:06:19 +0000119 if ( p->value == s )
120 return p->string;
121 }
122 llvm::report_fatal_error("bad scope value");
123}
124
125
126
127
128
129
130
131
Nick Kledzik7735a7d2012-01-04 23:58:17 +0000132struct ContentTypeMapping {
Nick Kledzik23384e82012-02-07 02:59:54 +0000133 const char* string;
134 DefinedAtom::ContentType value;
Nick Kledzik7735a7d2012-01-04 23:58:17 +0000135};
136
137static const ContentTypeMapping typeMappings[] = {
Nick Kledzik23384e82012-02-07 02:59:54 +0000138 { "unknown", DefinedAtom::typeUnknown },
139 { "code", DefinedAtom::typeCode },
Nick Kledzik1a6615d2012-03-08 00:18:30 +0000140 { "stub", DefinedAtom::typeStub },
Nick Kledzik23384e82012-02-07 02:59:54 +0000141 { "resolver", DefinedAtom::typeResolver },
142 { "constant", DefinedAtom::typeConstant },
143 { "c-string", DefinedAtom::typeCString },
144 { "utf16-string", DefinedAtom::typeUTF16String },
145 { "CFI", DefinedAtom::typeCFI },
146 { "LSDA", DefinedAtom::typeLSDA },
147 { "literal-4", DefinedAtom::typeLiteral4 },
148 { "literal-8", DefinedAtom::typeLiteral8 },
149 { "literal-16", DefinedAtom::typeLiteral16 },
150 { "data", DefinedAtom::typeData },
151 { "zero-fill", DefinedAtom::typeZeroFill },
152 { "cf-string", DefinedAtom::typeCFString },
153 { "initializer-ptr",DefinedAtom::typeInitializerPtr },
154 { "terminator-ptr", DefinedAtom::typeTerminatorPtr },
155 { "c-string-ptr", DefinedAtom::typeCStringPtr },
156 { "objc1-class", DefinedAtom::typeObjC1Class },
157 { "objc1-class-ptr",DefinedAtom::typeObjCClassPtr },
158 { "objc2-cat-ptr", DefinedAtom::typeObjC2CategoryList },
159 { "tlv-thunk", DefinedAtom::typeThunkTLV },
160 { "tlv-data", DefinedAtom::typeTLVInitialData },
161 { "tlv-zero-fill", DefinedAtom::typeTLVInitialZeroFill },
162 { "tlv-init-ptr", DefinedAtom::typeTLVInitializerPtr },
Nick Kledzikf4fb2c52012-01-11 01:06:19 +0000163 { NULL, DefinedAtom::typeUnknown }
Nick Kledzik7735a7d2012-01-04 23:58:17 +0000164};
165
Nick Kledzikf4fb2c52012-01-11 01:06:19 +0000166DefinedAtom::ContentType KeyValues::contentType(const char* s)
Nick Kledzik7735a7d2012-01-04 23:58:17 +0000167{
Nick Kledzik23384e82012-02-07 02:59:54 +0000168 for (const ContentTypeMapping* p = typeMappings; p->string != NULL; ++p) {
Nick Kledzik7735a7d2012-01-04 23:58:17 +0000169 if ( strcmp(p->string, s) == 0 )
170 return p->value;
171 }
172 llvm::report_fatal_error("bad content type value");
173}
174
Nick Kledzikf4fb2c52012-01-11 01:06:19 +0000175const char* KeyValues::contentType(DefinedAtom::ContentType s) {
Nick Kledzik23384e82012-02-07 02:59:54 +0000176 for (const ContentTypeMapping* p = typeMappings; p->string != NULL; ++p) {
Nick Kledzik7735a7d2012-01-04 23:58:17 +0000177 if ( p->value == s )
178 return p->string;
179 }
180 llvm::report_fatal_error("bad content type value");
181}
182
183
184
185
186
187
188
189struct DeadStripMapping {
Nick Kledzik23384e82012-02-07 02:59:54 +0000190 const char* string;
191 DefinedAtom::DeadStripKind value;
Nick Kledzik7735a7d2012-01-04 23:58:17 +0000192};
193
194static const DeadStripMapping deadStripMappings[] = {
Nick Kledzik23384e82012-02-07 02:59:54 +0000195 { "normal", DefinedAtom::deadStripNormal },
196 { "never", DefinedAtom::deadStripNever },
197 { "always", DefinedAtom::deadStripAlways },
Nick Kledzikf4fb2c52012-01-11 01:06:19 +0000198 { NULL, DefinedAtom::deadStripNormal }
Nick Kledzik7735a7d2012-01-04 23:58:17 +0000199};
200
Nick Kledzikf4fb2c52012-01-11 01:06:19 +0000201DefinedAtom::DeadStripKind KeyValues::deadStripKind(const char* s)
Nick Kledzik7735a7d2012-01-04 23:58:17 +0000202{
Nick Kledzik23384e82012-02-07 02:59:54 +0000203 for (const DeadStripMapping* p = deadStripMappings; p->string != NULL; ++p) {
Nick Kledzik7735a7d2012-01-04 23:58:17 +0000204 if ( strcmp(p->string, s) == 0 )
205 return p->value;
206 }
207 llvm::report_fatal_error("bad dead strip value");
208}
209
Nick Kledzikf4fb2c52012-01-11 01:06:19 +0000210const char* KeyValues::deadStripKind(DefinedAtom::DeadStripKind dsk) {
Nick Kledzik23384e82012-02-07 02:59:54 +0000211 for (const DeadStripMapping* p = deadStripMappings; p->string != NULL; ++p) {
Nick Kledzik7735a7d2012-01-04 23:58:17 +0000212 if ( p->value == dsk )
213 return p->string;
214 }
215 llvm::report_fatal_error("bad dead strip value");
216}
217
218
219
220
221
Nick Kledzikf4fb2c52012-01-11 01:06:19 +0000222struct InterposableMapping {
Nick Kledzik23384e82012-02-07 02:59:54 +0000223 const char* string;
224 DefinedAtom::Interposable value;
Nick Kledzikf4fb2c52012-01-11 01:06:19 +0000225};
226
227static const InterposableMapping interMappings[] = {
Nick Kledzik23384e82012-02-07 02:59:54 +0000228 { "no", DefinedAtom::interposeNo },
229 { "yes", DefinedAtom::interposeYes },
230 { "yesAndWeak", DefinedAtom::interposeYesAndRuntimeWeak },
Nick Kledzikf4fb2c52012-01-11 01:06:19 +0000231 { NULL, DefinedAtom::interposeNo }
232};
233
234DefinedAtom::Interposable KeyValues::interposable(const char* s)
235{
Nick Kledzik23384e82012-02-07 02:59:54 +0000236 for (const InterposableMapping* p = interMappings; p->string != NULL; ++p) {
Nick Kledzikf4fb2c52012-01-11 01:06:19 +0000237 if ( strcmp(p->string, s) == 0 )
238 return p->value;
239 }
240 llvm::report_fatal_error("bad interposable value");
241}
242
243const char* KeyValues::interposable(DefinedAtom::Interposable in) {
Nick Kledzik23384e82012-02-07 02:59:54 +0000244 for (const InterposableMapping* p = interMappings; p->string != NULL; ++p) {
Nick Kledzikf4fb2c52012-01-11 01:06:19 +0000245 if ( p->value == in )
246 return p->string;
247 }
248 llvm::report_fatal_error("bad interposable value");
249}
250
251
252
253
254
255
256struct MergeMapping {
Nick Kledzik23384e82012-02-07 02:59:54 +0000257 const char* string;
258 DefinedAtom::Merge value;
Nick Kledzikf4fb2c52012-01-11 01:06:19 +0000259};
260
261static const MergeMapping mergeMappings[] = {
Nick Kledzik23384e82012-02-07 02:59:54 +0000262 { "no", DefinedAtom::mergeNo },
263 { "asTentative", DefinedAtom::mergeAsTentative },
264 { "asWeak", DefinedAtom::mergeAsWeak },
265 { "asAddressedWeak",DefinedAtom::mergeAsWeakAndAddressUsed },
Nick Kledzikf4fb2c52012-01-11 01:06:19 +0000266 { NULL, DefinedAtom::mergeNo }
267};
268
269DefinedAtom::Merge KeyValues::merge(const char* s)
270{
Nick Kledzik23384e82012-02-07 02:59:54 +0000271 for (const MergeMapping* p = mergeMappings; p->string != NULL; ++p) {
Nick Kledzikf4fb2c52012-01-11 01:06:19 +0000272 if ( strcmp(p->string, s) == 0 )
273 return p->value;
274 }
275 llvm::report_fatal_error("bad merge value");
276}
277
278const char* KeyValues::merge(DefinedAtom::Merge in) {
Nick Kledzik23384e82012-02-07 02:59:54 +0000279 for (const MergeMapping* p = mergeMappings; p->string != NULL; ++p) {
Nick Kledzikf4fb2c52012-01-11 01:06:19 +0000280 if ( p->value == in )
281 return p->string;
282 }
283 llvm::report_fatal_error("bad merge value");
284}
285
286
287
288
289
Nick Kledzik7735a7d2012-01-04 23:58:17 +0000290
291struct SectionChoiceMapping {
Nick Kledzik23384e82012-02-07 02:59:54 +0000292 const char* string;
293 DefinedAtom::SectionChoice value;
Nick Kledzik7735a7d2012-01-04 23:58:17 +0000294};
295
296static const SectionChoiceMapping sectMappings[] = {
Nick Kledzik23384e82012-02-07 02:59:54 +0000297 { "content", DefinedAtom::sectionBasedOnContent },
298 { "custom", DefinedAtom::sectionCustomPreferred },
299 { "custom-required", DefinedAtom::sectionCustomRequired },
Nick Kledzikf4fb2c52012-01-11 01:06:19 +0000300 { NULL, DefinedAtom::sectionBasedOnContent }
Nick Kledzik7735a7d2012-01-04 23:58:17 +0000301};
302
Nick Kledzikf4fb2c52012-01-11 01:06:19 +0000303DefinedAtom::SectionChoice KeyValues::sectionChoice(const char* s)
Nick Kledzik7735a7d2012-01-04 23:58:17 +0000304{
Nick Kledzik23384e82012-02-07 02:59:54 +0000305 for (const SectionChoiceMapping* p = sectMappings; p->string != NULL; ++p) {
Nick Kledzik7735a7d2012-01-04 23:58:17 +0000306 if ( strcmp(p->string, s) == 0 )
307 return p->value;
308 }
309 llvm::report_fatal_error("bad dead strip value");
310}
311
Nick Kledzikf4fb2c52012-01-11 01:06:19 +0000312const char* KeyValues::sectionChoice(DefinedAtom::SectionChoice s) {
Nick Kledzik23384e82012-02-07 02:59:54 +0000313 for (const SectionChoiceMapping* p = sectMappings; p->string != NULL; ++p) {
Nick Kledzik7735a7d2012-01-04 23:58:17 +0000314 if ( p->value == s )
315 return p->string;
316 }
317 llvm::report_fatal_error("bad dead strip value");
318}
319
320
321
322
323
324
325
Nick Kledzikf4fb2c52012-01-11 01:06:19 +0000326struct PermissionsMapping {
Nick Kledzik23384e82012-02-07 02:59:54 +0000327 const char* string;
328 DefinedAtom::ContentPermissions value;
Nick Kledzikf4fb2c52012-01-11 01:06:19 +0000329};
330
331static const PermissionsMapping permMappings[] = {
Nick Kledzik23384e82012-02-07 02:59:54 +0000332 { "content", DefinedAtom::perm___ },
333 { "custom", DefinedAtom::permR__ },
334 { "custom-required", DefinedAtom::permR_X },
335 { "custom-required", DefinedAtom::permRW_ },
336 { "custom-required", DefinedAtom::permRW_L },
Nick Kledzikf4fb2c52012-01-11 01:06:19 +0000337 { NULL, DefinedAtom::perm___ }
338};
339
340DefinedAtom::ContentPermissions KeyValues::permissions(const char* s)
341{
Nick Kledzik23384e82012-02-07 02:59:54 +0000342 for (const PermissionsMapping* p = permMappings; p->string != NULL; ++p) {
Nick Kledzikf4fb2c52012-01-11 01:06:19 +0000343 if ( strcmp(p->string, s) == 0 )
344 return p->value;
345 }
346 llvm::report_fatal_error("bad permissions value");
347}
348
349const char* KeyValues::permissions(DefinedAtom::ContentPermissions s) {
Nick Kledzik23384e82012-02-07 02:59:54 +0000350 for (const PermissionsMapping* p = permMappings; p->string != NULL; ++p) {
Nick Kledzikf4fb2c52012-01-11 01:06:19 +0000351 if ( p->value == s )
352 return p->string;
353 }
354 llvm::report_fatal_error("bad permissions value");
355}
356
357
358
359
360
361
362
Nick Kledzik7735a7d2012-01-04 23:58:17 +0000363bool KeyValues::isThumb(const char* s)
364{
365 if ( strcmp(s, "true") == 0 )
366 return true;
367 else if ( strcmp(s, "false") == 0 )
368 return false;
369 llvm::report_fatal_error("bad is-thumb value");
370}
371
372const char* KeyValues::isThumb(bool b) {
373 return b ? "true" : "false";
374}
375
376
377
378
379bool KeyValues::isAlias(const char* s)
380{
381 if ( strcmp(s, "true") == 0 )
382 return true;
383 else if ( strcmp(s, "false") == 0 )
384 return false;
385 llvm::report_fatal_error("bad is-alias value");
386}
387
388const char* KeyValues::isAlias(bool b) {
389 return b ? "true" : "false";
390}
391
392
393
394
Nick Kledzik6bc04c62012-02-22 21:56:59 +0000395struct CanBeNullMapping {
396 const char* string;
397 UndefinedAtom::CanBeNull value;
398};
399
400static const CanBeNullMapping cbnMappings[] = {
401 { "never", UndefinedAtom::canBeNullNever },
402 { "at-runtime", UndefinedAtom::canBeNullAtRuntime },
403 { "at-buildtime", UndefinedAtom::canBeNullAtBuildtime },
404 { NULL, UndefinedAtom::canBeNullNever }
405};
406
407
408UndefinedAtom::CanBeNull KeyValues::canBeNull(const char* s)
Nick Kledzik23384e82012-02-07 02:59:54 +0000409{
Nick Kledzik6bc04c62012-02-22 21:56:59 +0000410 for (const CanBeNullMapping* p = cbnMappings; p->string != NULL; ++p) {
411 if ( strcmp(p->string, s) == 0 )
412 return p->value;
413 }
414 llvm::report_fatal_error("bad can-be-null value");
Nick Kledzik23384e82012-02-07 02:59:54 +0000415}
416
Nick Kledzik6bc04c62012-02-22 21:56:59 +0000417const char* KeyValues::canBeNull(UndefinedAtom::CanBeNull c) {
418 for (const CanBeNullMapping* p = cbnMappings; p->string != NULL; ++p) {
419 if ( p->value == c )
420 return p->string;
421 }
422 llvm::report_fatal_error("bad can-be-null value");
Nick Kledzik23384e82012-02-07 02:59:54 +0000423}
424
425
426
427
428
Nick Kledzik7735a7d2012-01-04 23:58:17 +0000429
430
431} // namespace yaml
432} // namespace lld