1 //===- lib/Support/YAMLTraits.cpp -----------------------------------------===//
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 "llvm/Support/YAMLTraits.h"
11 #include "llvm/ADT/STLExtras.h"
12 #include "llvm/ADT/SmallString.h"
13 #include "llvm/ADT/StringExtras.h"
14 #include "llvm/ADT/StringRef.h"
15 #include "llvm/ADT/Twine.h"
16 #include "llvm/Support/Casting.h"
17 #include "llvm/Support/Errc.h"
18 #include "llvm/Support/ErrorHandling.h"
19 #include "llvm/Support/Format.h"
20 #include "llvm/Support/LineIterator.h"
21 #include "llvm/Support/MemoryBuffer.h"
22 #include "llvm/Support/YAMLParser.h"
23 #include "llvm/Support/raw_ostream.h"
24 #include <algorithm>
25 #include <cassert>
26 #include <cstdint>
27 #include <cstdlib>
28 #include <cstring>
29 #include <string>
30 #include <vector>
31 
32 using namespace llvm;
33 using namespace yaml;
34 
35 //===----------------------------------------------------------------------===//
36 //  IO
37 //===----------------------------------------------------------------------===//
38 
39 IO::IO(void *Context) : Ctxt(Context) {}
40 
41 IO::~IO() = default;
42 
43 void *IO::getContext() {
44   return Ctxt;
45 }
46 
47 void IO::setContext(void *Context) {
48   Ctxt = Context;
49 }
50 
51 //===----------------------------------------------------------------------===//
52 //  Input
53 //===----------------------------------------------------------------------===//
54 
55 Input::Input(StringRef InputContent, void *Ctxt,
56              SourceMgr::DiagHandlerTy DiagHandler, void *DiagHandlerCtxt)
57     : IO(Ctxt), Strm(new Stream(InputContent, SrcMgr, false, &EC)) {
58   if (DiagHandler)
59     SrcMgr.setDiagHandler(DiagHandler, DiagHandlerCtxt);
60   DocIterator = Strm->begin();
61 }
62 
63 Input::~Input() = default;
64 
65 std::error_code Input::error() { return EC; }
66 
67 // Pin the vtables to this file.
68 void Input::HNode::anchor() {}
69 void Input::EmptyHNode::anchor() {}
70 void Input::ScalarHNode::anchor() {}
71 void Input::MapHNode::anchor() {}
72 void Input::SequenceHNode::anchor() {}
73 
74 bool Input::outputting() {
75   return false;
76 }
77 
78 bool Input::setCurrentDocument() {
79   if (DocIterator != Strm->end()) {
80     Node *N = DocIterator->getRoot();
81     if (!N) {
82       assert(Strm->failed() && "Root is NULL iff parsing failed");
83       EC = make_error_code(errc::invalid_argument);
84       return false;
85     }
86 
87     if (isa<NullNode>(N)) {
88       // Empty files are allowed and ignored
89       ++DocIterator;
90       return setCurrentDocument();
91     }
92     TopNode = this->createHNodes(N);
93     CurrentNode = TopNode.get();
94     return true;
95   }
96   return false;
97 }
98 
99 bool Input::nextDocument() {
100   return ++DocIterator != Strm->end();
101 }
102 
103 const Node *Input::getCurrentNode() const {
104   return CurrentNode ? CurrentNode->_node : nullptr;
105 }
106 
107 bool Input::mapTag(StringRef Tag, bool Default) {
108   std::string foundTag = CurrentNode->_node->getVerbatimTag();
109   if (foundTag.empty()) {
110     // If no tag found and 'Tag' is the default, say it was found.
111     return Default;
112   }
113   // Return true iff found tag matches supplied tag.
114   return Tag.equals(foundTag);
115 }
116 
117 void Input::beginMapping() {
118   if (EC)
119     return;
120   // CurrentNode can be null if the document is empty.
121   MapHNode *MN = dyn_cast_or_null<MapHNode>(CurrentNode);
122   if (MN) {
123     MN->ValidKeys.clear();
124   }
125 }
126 
127 std::vector<StringRef> Input::keys() {
128   MapHNode *MN = dyn_cast<MapHNode>(CurrentNode);
129   std::vector<StringRef> Ret;
130   if (!MN) {
131     setError(CurrentNode, "not a mapping");
132     return Ret;
133   }
134   for (auto &P : MN->Mapping)
135     Ret.push_back(P.first());
136   return Ret;
137 }
138 
139 bool Input::preflightKey(const char *Key, bool Required, bool, bool &UseDefault,
140                          void *&SaveInfo) {
141   UseDefault = false;
142   if (EC)
143     return false;
144 
145   // CurrentNode is null for empty documents, which is an error in case required
146   // nodes are present.
147   if (!CurrentNode) {
148     if (Required)
149       EC = make_error_code(errc::invalid_argument);
150     return false;
151   }
152 
153   MapHNode *MN = dyn_cast<MapHNode>(CurrentNode);
154   if (!MN) {
155     setError(CurrentNode, "not a mapping");
156     return false;
157   }
158   MN->ValidKeys.push_back(Key);
159   HNode *Value = MN->Mapping[Key].get();
160   if (!Value) {
161     if (Required)
162       setError(CurrentNode, Twine("missing required key '") + Key + "'");
163     else
164       UseDefault = true;
165     return false;
166   }
167   SaveInfo = CurrentNode;
168   CurrentNode = Value;
169   return true;
170 }
171 
172 void Input::postflightKey(void *saveInfo) {
173   CurrentNode = reinterpret_cast<HNode *>(saveInfo);
174 }
175 
176 void Input::endMapping() {
177   if (EC)
178     return;
179   // CurrentNode can be null if the document is empty.
180   MapHNode *MN = dyn_cast_or_null<MapHNode>(CurrentNode);
181   if (!MN)
182     return;
183   for (const auto &NN : MN->Mapping) {
184     if (!is_contained(MN->ValidKeys, NN.first())) {
185       setError(NN.second.get(), Twine("unknown key '") + NN.first() + "'");
186       break;
187     }
188   }
189 }
190 
191 void Input::beginFlowMapping() { beginMapping(); }
192 
193 void Input::endFlowMapping() { endMapping(); }
194 
195 unsigned Input::beginSequence() {
196   if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode))
197     return SQ->Entries.size();
198   if (isa<EmptyHNode>(CurrentNode))
199     return 0;
200   // Treat case where there's a scalar "null" value as an empty sequence.
201   if (ScalarHNode *SN = dyn_cast<ScalarHNode>(CurrentNode)) {
202     if (isNull(SN->value()))
203       return 0;
204   }
205   // Any other type of HNode is an error.
206   setError(CurrentNode, "not a sequence");
207   return 0;
208 }
209 
210 void Input::endSequence() {
211 }
212 
213 bool Input::preflightElement(unsigned Index, void *&SaveInfo) {
214   if (EC)
215     return false;
216   if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) {
217     SaveInfo = CurrentNode;
218     CurrentNode = SQ->Entries[Index].get();
219     return true;
220   }
221   return false;
222 }
223 
224 void Input::postflightElement(void *SaveInfo) {
225   CurrentNode = reinterpret_cast<HNode *>(SaveInfo);
226 }
227 
228 unsigned Input::beginFlowSequence() { return beginSequence(); }
229 
230 bool Input::preflightFlowElement(unsigned index, void *&SaveInfo) {
231   if (EC)
232     return false;
233   if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) {
234     SaveInfo = CurrentNode;
235     CurrentNode = SQ->Entries[index].get();
236     return true;
237   }
238   return false;
239 }
240 
241 void Input::postflightFlowElement(void *SaveInfo) {
242   CurrentNode = reinterpret_cast<HNode *>(SaveInfo);
243 }
244 
245 void Input::endFlowSequence() {
246 }
247 
248 void Input::beginEnumScalar() {
249   ScalarMatchFound = false;
250 }
251 
252 bool Input::matchEnumScalar(const char *Str, bool) {
253   if (ScalarMatchFound)
254     return false;
255   if (ScalarHNode *SN = dyn_cast<ScalarHNode>(CurrentNode)) {
256     if (SN->value().equals(Str)) {
257       ScalarMatchFound = true;
258       return true;
259     }
260   }
261   return false;
262 }
263 
264 bool Input::matchEnumFallback() {
265   if (ScalarMatchFound)
266     return false;
267   ScalarMatchFound = true;
268   return true;
269 }
270 
271 void Input::endEnumScalar() {
272   if (!ScalarMatchFound) {
273     setError(CurrentNode, "unknown enumerated scalar");
274   }
275 }
276 
277 bool Input::beginBitSetScalar(bool &DoClear) {
278   BitValuesUsed.clear();
279   if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) {
280     BitValuesUsed.insert(BitValuesUsed.begin(), SQ->Entries.size(), false);
281   } else {
282     setError(CurrentNode, "expected sequence of bit values");
283   }
284   DoClear = true;
285   return true;
286 }
287 
288 bool Input::bitSetMatch(const char *Str, bool) {
289   if (EC)
290     return false;
291   if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) {
292     unsigned Index = 0;
293     for (auto &N : SQ->Entries) {
294       if (ScalarHNode *SN = dyn_cast<ScalarHNode>(N.get())) {
295         if (SN->value().equals(Str)) {
296           BitValuesUsed[Index] = true;
297           return true;
298         }
299       } else {
300         setError(CurrentNode, "unexpected scalar in sequence of bit values");
301       }
302       ++Index;
303     }
304   } else {
305     setError(CurrentNode, "expected sequence of bit values");
306   }
307   return false;
308 }
309 
310 void Input::endBitSetScalar() {
311   if (EC)
312     return;
313   if (SequenceHNode *SQ = dyn_cast<SequenceHNode>(CurrentNode)) {
314     assert(BitValuesUsed.size() == SQ->Entries.size());
315     for (unsigned i = 0; i < SQ->Entries.size(); ++i) {
316       if (!BitValuesUsed[i]) {
317         setError(SQ->Entries[i].get(), "unknown bit value");
318         return;
319       }
320     }
321   }
322 }
323 
324 void Input::scalarString(StringRef &S, bool) {
325   if (ScalarHNode *SN = dyn_cast<ScalarHNode>(CurrentNode)) {
326     S = SN->value();
327   } else {
328     setError(CurrentNode, "unexpected scalar");
329   }
330 }
331 
332 void Input::blockScalarString(StringRef &S) { scalarString(S, false); }
333 
334 void Input::setError(HNode *hnode, const Twine &message) {
335   assert(hnode && "HNode must not be NULL");
336   this->setError(hnode->_node, message);
337 }
338 
339 void Input::setError(Node *node, const Twine &message) {
340   Strm->printError(node, message);
341   EC = make_error_code(errc::invalid_argument);
342 }
343 
344 std::unique_ptr<Input::HNode> Input::createHNodes(Node *N) {
345   SmallString<128> StringStorage;
346   if (ScalarNode *SN = dyn_cast<ScalarNode>(N)) {
347     StringRef KeyStr = SN->getValue(StringStorage);
348     if (!StringStorage.empty()) {
349       // Copy string to permanent storage
350       KeyStr = StringStorage.str().copy(StringAllocator);
351     }
352     return llvm::make_unique<ScalarHNode>(N, KeyStr);
353   } else if (BlockScalarNode *BSN = dyn_cast<BlockScalarNode>(N)) {
354     StringRef ValueCopy = BSN->getValue().copy(StringAllocator);
355     return llvm::make_unique<ScalarHNode>(N, ValueCopy);
356   } else if (SequenceNode *SQ = dyn_cast<SequenceNode>(N)) {
357     auto SQHNode = llvm::make_unique<SequenceHNode>(N);
358     for (Node &SN : *SQ) {
359       auto Entry = this->createHNodes(&SN);
360       if (EC)
361         break;
362       SQHNode->Entries.push_back(std::move(Entry));
363     }
364     return std::move(SQHNode);
365   } else if (MappingNode *Map = dyn_cast<MappingNode>(N)) {
366     auto mapHNode = llvm::make_unique<MapHNode>(N);
367     for (KeyValueNode &KVN : *Map) {
368       Node *KeyNode = KVN.getKey();
369       ScalarNode *KeyScalar = dyn_cast<ScalarNode>(KeyNode);
370       if (!KeyScalar) {
371         setError(KeyNode, "Map key must be a scalar");
372         break;
373       }
374       StringStorage.clear();
375       StringRef KeyStr = KeyScalar->getValue(StringStorage);
376       if (!StringStorage.empty()) {
377         // Copy string to permanent storage
378         KeyStr = StringStorage.str().copy(StringAllocator);
379       }
380       auto ValueHNode = this->createHNodes(KVN.getValue());
381       if (EC)
382         break;
383       mapHNode->Mapping[KeyStr] = std::move(ValueHNode);
384     }
385     return std::move(mapHNode);
386   } else if (isa<NullNode>(N)) {
387     return llvm::make_unique<EmptyHNode>(N);
388   } else {
389     setError(N, "unknown node kind");
390     return nullptr;
391   }
392 }
393 
394 void Input::setError(const Twine &Message) {
395   this->setError(CurrentNode, Message);
396 }
397 
398 bool Input::canElideEmptySequence() {
399   return false;
400 }
401 
402 //===----------------------------------------------------------------------===//
403 //  Output
404 //===----------------------------------------------------------------------===//
405 
406 Output::Output(raw_ostream &yout, void *context, int WrapColumn)
407     : IO(context), Out(yout), WrapColumn(WrapColumn) {}
408 
409 Output::~Output() = default;
410 
411 bool Output::outputting() {
412   return true;
413 }
414 
415 void Output::beginMapping() {
416   StateStack.push_back(inMapFirstKey);
417   NeedsNewLine = true;
418 }
419 
420 bool Output::mapTag(StringRef Tag, bool Use) {
421   if (Use) {
422     // If this tag is being written inside a sequence we should write the start
423     // of the sequence before writing the tag, otherwise the tag won't be
424     // attached to the element in the sequence, but rather the sequence itself.
425     bool SequenceElement =
426         StateStack.size() > 1 && (StateStack[StateStack.size() - 2] == inSeq ||
427           StateStack[StateStack.size() - 2] == inFlowSeq);
428     if (SequenceElement && StateStack.back() == inMapFirstKey) {
429       this->newLineCheck();
430     } else {
431       this->output(" ");
432     }
433     this->output(Tag);
434     if (SequenceElement) {
435       // If we're writing the tag during the first element of a map, the tag
436       // takes the place of the first element in the sequence.
437       if (StateStack.back() == inMapFirstKey) {
438         StateStack.pop_back();
439         StateStack.push_back(inMapOtherKey);
440       }
441       // Tags inside maps in sequences should act as keys in the map from a
442       // formatting perspective, so we always want a newline in a sequence.
443       NeedsNewLine = true;
444     }
445   }
446   return Use;
447 }
448 
449 void Output::endMapping() {
450   StateStack.pop_back();
451 }
452 
453 std::vector<StringRef> Output::keys() {
454   report_fatal_error("invalid call");
455 }
456 
457 bool Output::preflightKey(const char *Key, bool Required, bool SameAsDefault,
458                           bool &UseDefault, void *&) {
459   UseDefault = false;
460   if (Required || !SameAsDefault || WriteDefaultValues) {
461     auto State = StateStack.back();
462     if (State == inFlowMapFirstKey || State == inFlowMapOtherKey) {
463       flowKey(Key);
464     } else {
465       this->newLineCheck();
466       this->paddedKey(Key);
467     }
468     return true;
469   }
470   return false;
471 }
472 
473 void Output::postflightKey(void *) {
474   if (StateStack.back() == inMapFirstKey) {
475     StateStack.pop_back();
476     StateStack.push_back(inMapOtherKey);
477   } else if (StateStack.back() == inFlowMapFirstKey) {
478     StateStack.pop_back();
479     StateStack.push_back(inFlowMapOtherKey);
480   }
481 }
482 
483 void Output::beginFlowMapping() {
484   StateStack.push_back(inFlowMapFirstKey);
485   this->newLineCheck();
486   ColumnAtMapFlowStart = Column;
487   output("{ ");
488 }
489 
490 void Output::endFlowMapping() {
491   StateStack.pop_back();
492   this->outputUpToEndOfLine(" }");
493 }
494 
495 void Output::beginDocuments() {
496   this->outputUpToEndOfLine("---");
497 }
498 
499 bool Output::preflightDocument(unsigned index) {
500   if (index > 0)
501     this->outputUpToEndOfLine("\n---");
502   return true;
503 }
504 
505 void Output::postflightDocument() {
506 }
507 
508 void Output::endDocuments() {
509   output("\n...\n");
510 }
511 
512 unsigned Output::beginSequence() {
513   StateStack.push_back(inSeq);
514   NeedsNewLine = true;
515   return 0;
516 }
517 
518 void Output::endSequence() {
519   StateStack.pop_back();
520 }
521 
522 bool Output::preflightElement(unsigned, void *&) {
523   return true;
524 }
525 
526 void Output::postflightElement(void *) {
527 }
528 
529 unsigned Output::beginFlowSequence() {
530   StateStack.push_back(inFlowSeq);
531   this->newLineCheck();
532   ColumnAtFlowStart = Column;
533   output("[ ");
534   NeedFlowSequenceComma = false;
535   return 0;
536 }
537 
538 void Output::endFlowSequence() {
539   StateStack.pop_back();
540   this->outputUpToEndOfLine(" ]");
541 }
542 
543 bool Output::preflightFlowElement(unsigned, void *&) {
544   if (NeedFlowSequenceComma)
545     output(", ");
546   if (WrapColumn && Column > WrapColumn) {
547     output("\n");
548     for (int i = 0; i < ColumnAtFlowStart; ++i)
549       output(" ");
550     Column = ColumnAtFlowStart;
551     output("  ");
552   }
553   return true;
554 }
555 
556 void Output::postflightFlowElement(void *) {
557   NeedFlowSequenceComma = true;
558 }
559 
560 void Output::beginEnumScalar() {
561   EnumerationMatchFound = false;
562 }
563 
564 bool Output::matchEnumScalar(const char *Str, bool Match) {
565   if (Match && !EnumerationMatchFound) {
566     this->newLineCheck();
567     this->outputUpToEndOfLine(Str);
568     EnumerationMatchFound = true;
569   }
570   return false;
571 }
572 
573 bool Output::matchEnumFallback() {
574   if (EnumerationMatchFound)
575     return false;
576   EnumerationMatchFound = true;
577   return true;
578 }
579 
580 void Output::endEnumScalar() {
581   if (!EnumerationMatchFound)
582     llvm_unreachable("bad runtime enum value");
583 }
584 
585 bool Output::beginBitSetScalar(bool &DoClear) {
586   this->newLineCheck();
587   output("[ ");
588   NeedBitValueComma = false;
589   DoClear = false;
590   return true;
591 }
592 
593 bool Output::bitSetMatch(const char *Str, bool Matches) {
594   if (Matches) {
595     if (NeedBitValueComma)
596       output(", ");
597     this->output(Str);
598     NeedBitValueComma = true;
599   }
600   return false;
601 }
602 
603 void Output::endBitSetScalar() {
604   this->outputUpToEndOfLine(" ]");
605 }
606 
607 void Output::scalarString(StringRef &S, bool MustQuote) {
608   this->newLineCheck();
609   if (S.empty()) {
610     // Print '' for the empty string because leaving the field empty is not
611     // allowed.
612     this->outputUpToEndOfLine("''");
613     return;
614   }
615   if (!MustQuote) {
616     // Only quote if we must.
617     this->outputUpToEndOfLine(S);
618     return;
619   }
620   unsigned i = 0;
621   unsigned j = 0;
622   unsigned End = S.size();
623   output("'"); // Starting single quote.
624   const char *Base = S.data();
625   while (j < End) {
626     // Escape a single quote by doubling it.
627     if (S[j] == '\'') {
628       output(StringRef(&Base[i], j - i + 1));
629       output("'");
630       i = j + 1;
631     }
632     ++j;
633   }
634   output(StringRef(&Base[i], j - i));
635   this->outputUpToEndOfLine("'"); // Ending single quote.
636 }
637 
638 void Output::blockScalarString(StringRef &S) {
639   if (!StateStack.empty())
640     newLineCheck();
641   output(" |");
642   outputNewLine();
643 
644   unsigned Indent = StateStack.empty() ? 1 : StateStack.size();
645 
646   auto Buffer = MemoryBuffer::getMemBuffer(S, "", false);
647   for (line_iterator Lines(*Buffer, false); !Lines.is_at_end(); ++Lines) {
648     for (unsigned I = 0; I < Indent; ++I) {
649       output("  ");
650     }
651     output(*Lines);
652     outputNewLine();
653   }
654 }
655 
656 void Output::setError(const Twine &message) {
657 }
658 
659 bool Output::canElideEmptySequence() {
660   // Normally, with an optional key/value where the value is an empty sequence,
661   // the whole key/value can be not written.  But, that produces wrong yaml
662   // if the key/value is the only thing in the map and the map is used in
663   // a sequence.  This detects if the this sequence is the first key/value
664   // in map that itself is embedded in a sequnce.
665   if (StateStack.size() < 2)
666     return true;
667   if (StateStack.back() != inMapFirstKey)
668     return true;
669   return (StateStack[StateStack.size()-2] != inSeq);
670 }
671 
672 void Output::output(StringRef s) {
673   Column += s.size();
674   Out << s;
675 }
676 
677 void Output::outputUpToEndOfLine(StringRef s) {
678   this->output(s);
679   if (StateStack.empty() || (StateStack.back() != inFlowSeq &&
680                              StateStack.back() != inFlowMapFirstKey &&
681                              StateStack.back() != inFlowMapOtherKey))
682     NeedsNewLine = true;
683 }
684 
685 void Output::outputNewLine() {
686   Out << "\n";
687   Column = 0;
688 }
689 
690 // if seq at top, indent as if map, then add "- "
691 // if seq in middle, use "- " if firstKey, else use "  "
692 //
693 
694 void Output::newLineCheck() {
695   if (!NeedsNewLine)
696     return;
697   NeedsNewLine = false;
698 
699   this->outputNewLine();
700 
701   assert(StateStack.size() > 0);
702   unsigned Indent = StateStack.size() - 1;
703   bool OutputDash = false;
704 
705   if (StateStack.back() == inSeq) {
706     OutputDash = true;
707   } else if ((StateStack.size() > 1) && ((StateStack.back() == inMapFirstKey) ||
708              (StateStack.back() == inFlowSeq) ||
709              (StateStack.back() == inFlowMapFirstKey)) &&
710              (StateStack[StateStack.size() - 2] == inSeq)) {
711     --Indent;
712     OutputDash = true;
713   }
714 
715   for (unsigned i = 0; i < Indent; ++i) {
716     output("  ");
717   }
718   if (OutputDash) {
719     output("- ");
720   }
721 
722 }
723 
724 void Output::paddedKey(StringRef key) {
725   output(key);
726   output(":");
727   const char *spaces = "                ";
728   if (key.size() < strlen(spaces))
729     output(&spaces[key.size()]);
730   else
731     output(" ");
732 }
733 
734 void Output::flowKey(StringRef Key) {
735   if (StateStack.back() == inFlowMapOtherKey)
736     output(", ");
737   if (WrapColumn && Column > WrapColumn) {
738     output("\n");
739     for (int I = 0; I < ColumnAtMapFlowStart; ++I)
740       output(" ");
741     Column = ColumnAtMapFlowStart;
742     output("  ");
743   }
744   output(Key);
745   output(": ");
746 }
747 
748 //===----------------------------------------------------------------------===//
749 //  traits for built-in types
750 //===----------------------------------------------------------------------===//
751 
752 void ScalarTraits<bool>::output(const bool &Val, void *, raw_ostream &Out) {
753   Out << (Val ? "true" : "false");
754 }
755 
756 StringRef ScalarTraits<bool>::input(StringRef Scalar, void *, bool &Val) {
757   if (Scalar.equals("true")) {
758     Val = true;
759     return StringRef();
760   } else if (Scalar.equals("false")) {
761     Val = false;
762     return StringRef();
763   }
764   return "invalid boolean";
765 }
766 
767 void ScalarTraits<StringRef>::output(const StringRef &Val, void *,
768                                      raw_ostream &Out) {
769   Out << Val;
770 }
771 
772 StringRef ScalarTraits<StringRef>::input(StringRef Scalar, void *,
773                                          StringRef &Val) {
774   Val = Scalar;
775   return StringRef();
776 }
777 
778 void ScalarTraits<std::string>::output(const std::string &Val, void *,
779                                      raw_ostream &Out) {
780   Out << Val;
781 }
782 
783 StringRef ScalarTraits<std::string>::input(StringRef Scalar, void *,
784                                          std::string &Val) {
785   Val = Scalar.str();
786   return StringRef();
787 }
788 
789 void ScalarTraits<uint8_t>::output(const uint8_t &Val, void *,
790                                    raw_ostream &Out) {
791   // use temp uin32_t because ostream thinks uint8_t is a character
792   uint32_t Num = Val;
793   Out << Num;
794 }
795 
796 StringRef ScalarTraits<uint8_t>::input(StringRef Scalar, void *, uint8_t &Val) {
797   unsigned long long n;
798   if (getAsUnsignedInteger(Scalar, 0, n))
799     return "invalid number";
800   if (n > 0xFF)
801     return "out of range number";
802   Val = n;
803   return StringRef();
804 }
805 
806 void ScalarTraits<uint16_t>::output(const uint16_t &Val, void *,
807                                     raw_ostream &Out) {
808   Out << Val;
809 }
810 
811 StringRef ScalarTraits<uint16_t>::input(StringRef Scalar, void *,
812                                         uint16_t &Val) {
813   unsigned long long n;
814   if (getAsUnsignedInteger(Scalar, 0, n))
815     return "invalid number";
816   if (n > 0xFFFF)
817     return "out of range number";
818   Val = n;
819   return StringRef();
820 }
821 
822 void ScalarTraits<uint32_t>::output(const uint32_t &Val, void *,
823                                     raw_ostream &Out) {
824   Out << Val;
825 }
826 
827 StringRef ScalarTraits<uint32_t>::input(StringRef Scalar, void *,
828                                         uint32_t &Val) {
829   unsigned long long n;
830   if (getAsUnsignedInteger(Scalar, 0, n))
831     return "invalid number";
832   if (n > 0xFFFFFFFFUL)
833     return "out of range number";
834   Val = n;
835   return StringRef();
836 }
837 
838 void ScalarTraits<uint64_t>::output(const uint64_t &Val, void *,
839                                     raw_ostream &Out) {
840   Out << Val;
841 }
842 
843 StringRef ScalarTraits<uint64_t>::input(StringRef Scalar, void *,
844                                         uint64_t &Val) {
845   unsigned long long N;
846   if (getAsUnsignedInteger(Scalar, 0, N))
847     return "invalid number";
848   Val = N;
849   return StringRef();
850 }
851 
852 void ScalarTraits<int8_t>::output(const int8_t &Val, void *, raw_ostream &Out) {
853   // use temp in32_t because ostream thinks int8_t is a character
854   int32_t Num = Val;
855   Out << Num;
856 }
857 
858 StringRef ScalarTraits<int8_t>::input(StringRef Scalar, void *, int8_t &Val) {
859   long long N;
860   if (getAsSignedInteger(Scalar, 0, N))
861     return "invalid number";
862   if ((N > 127) || (N < -128))
863     return "out of range number";
864   Val = N;
865   return StringRef();
866 }
867 
868 void ScalarTraits<int16_t>::output(const int16_t &Val, void *,
869                                    raw_ostream &Out) {
870   Out << Val;
871 }
872 
873 StringRef ScalarTraits<int16_t>::input(StringRef Scalar, void *, int16_t &Val) {
874   long long N;
875   if (getAsSignedInteger(Scalar, 0, N))
876     return "invalid number";
877   if ((N > INT16_MAX) || (N < INT16_MIN))
878     return "out of range number";
879   Val = N;
880   return StringRef();
881 }
882 
883 void ScalarTraits<int32_t>::output(const int32_t &Val, void *,
884                                    raw_ostream &Out) {
885   Out << Val;
886 }
887 
888 StringRef ScalarTraits<int32_t>::input(StringRef Scalar, void *, int32_t &Val) {
889   long long N;
890   if (getAsSignedInteger(Scalar, 0, N))
891     return "invalid number";
892   if ((N > INT32_MAX) || (N < INT32_MIN))
893     return "out of range number";
894   Val = N;
895   return StringRef();
896 }
897 
898 void ScalarTraits<int64_t>::output(const int64_t &Val, void *,
899                                    raw_ostream &Out) {
900   Out << Val;
901 }
902 
903 StringRef ScalarTraits<int64_t>::input(StringRef Scalar, void *, int64_t &Val) {
904   long long N;
905   if (getAsSignedInteger(Scalar, 0, N))
906     return "invalid number";
907   Val = N;
908   return StringRef();
909 }
910 
911 void ScalarTraits<double>::output(const double &Val, void *, raw_ostream &Out) {
912   Out << format("%g", Val);
913 }
914 
915 StringRef ScalarTraits<double>::input(StringRef Scalar, void *, double &Val) {
916   if (to_float(Scalar, Val))
917     return StringRef();
918   return "invalid floating point number";
919 }
920 
921 void ScalarTraits<float>::output(const float &Val, void *, raw_ostream &Out) {
922   Out << format("%g", Val);
923 }
924 
925 StringRef ScalarTraits<float>::input(StringRef Scalar, void *, float &Val) {
926   if (to_float(Scalar, Val))
927     return StringRef();
928   return "invalid floating point number";
929 }
930 
931 void ScalarTraits<Hex8>::output(const Hex8 &Val, void *, raw_ostream &Out) {
932   uint8_t Num = Val;
933   Out << format("0x%02X", Num);
934 }
935 
936 StringRef ScalarTraits<Hex8>::input(StringRef Scalar, void *, Hex8 &Val) {
937   unsigned long long n;
938   if (getAsUnsignedInteger(Scalar, 0, n))
939     return "invalid hex8 number";
940   if (n > 0xFF)
941     return "out of range hex8 number";
942   Val = n;
943   return StringRef();
944 }
945 
946 void ScalarTraits<Hex16>::output(const Hex16 &Val, void *, raw_ostream &Out) {
947   uint16_t Num = Val;
948   Out << format("0x%04X", Num);
949 }
950 
951 StringRef ScalarTraits<Hex16>::input(StringRef Scalar, void *, Hex16 &Val) {
952   unsigned long long n;
953   if (getAsUnsignedInteger(Scalar, 0, n))
954     return "invalid hex16 number";
955   if (n > 0xFFFF)
956     return "out of range hex16 number";
957   Val = n;
958   return StringRef();
959 }
960 
961 void ScalarTraits<Hex32>::output(const Hex32 &Val, void *, raw_ostream &Out) {
962   uint32_t Num = Val;
963   Out << format("0x%08X", Num);
964 }
965 
966 StringRef ScalarTraits<Hex32>::input(StringRef Scalar, void *, Hex32 &Val) {
967   unsigned long long n;
968   if (getAsUnsignedInteger(Scalar, 0, n))
969     return "invalid hex32 number";
970   if (n > 0xFFFFFFFFUL)
971     return "out of range hex32 number";
972   Val = n;
973   return StringRef();
974 }
975 
976 void ScalarTraits<Hex64>::output(const Hex64 &Val, void *, raw_ostream &Out) {
977   uint64_t Num = Val;
978   Out << format("0x%016llX", Num);
979 }
980 
981 StringRef ScalarTraits<Hex64>::input(StringRef Scalar, void *, Hex64 &Val) {
982   unsigned long long Num;
983   if (getAsUnsignedInteger(Scalar, 0, Num))
984     return "invalid hex64 number";
985   Val = Num;
986   return StringRef();
987 }
988