LLVM: lib/Support/JSON.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
17#include
18#include
19#include
20
21namespace llvm {
22namespace json {
23
25 return try_emplace(K, nullptr).first->getSecond();
26}
28 return try_emplace(std::move(K), nullptr).first->getSecond();
29}
33 return nullptr;
34 return &I->second;
35}
39 return nullptr;
40 return &I->second;
41}
43 if (auto *V = get(K))
44 return V->getAsNull();
45 return std::nullopt;
46}
48 if (auto *V = get(K))
49 return V->getAsBoolean();
50 return std::nullopt;
51}
53 if (auto *V = get(K))
54 return V->getAsNumber();
55 return std::nullopt;
56}
58 if (auto *V = get(K))
59 return V->getAsInteger();
60 return std::nullopt;
61}
63 if (auto *V = get(K))
64 return V->getAsString();
65 return std::nullopt;
66}
68 if (auto *V = get(K))
69 return V->getAsObject();
70 return nullptr;
71}
73 if (auto *V = get(K))
74 return V->getAsObject();
75 return nullptr;
76}
78 if (auto *V = get(K))
79 return V->getAsArray();
80 return nullptr;
81}
83 if (auto *V = get(K))
84 return V->getAsArray();
85 return nullptr;
86}
88
90 V.reserve(Elements.size());
91 for (const Value &V : Elements) {
93 back().moveFrom(std::move(V));
94 }
95}
96
99
100void Value::copyFrom(const Value &M) {
102 switch (Type) {
103 case T_Null:
104 case T_Boolean:
105 case T_Double:
106 case T_Integer:
107 case T_UINT64:
108 memcpy(&Union, &M.Union, sizeof(Union));
109 break;
110 case T_StringRef:
111 create(M.as<StringRef>());
112 break;
113 case T_String:
114 createstd::string(M.asstd::string());
115 break;
116 case T_Object:
118 break;
119 case T_Array:
120 createjson::Array(M.as<json::Array>());
121 break;
122 }
123}
124
125void Value::moveFrom(const Value &&M) {
126 Type = M.Type;
127 switch (Type) {
128 case T_Null:
129 case T_Boolean:
130 case T_Double:
131 case T_Integer:
132 case T_UINT64:
133 memcpy(&Union, &M.Union, sizeof(Union));
134 break;
135 case T_StringRef:
136 create(M.as());
137 break;
138 case T_String:
139 createstd::string(std::move(M.asstd::string()));
140 M.Type = T_Null;
141 break;
142 case T_Object:
143 createjson::Object(std::move(M.asjson::Object()));
144 M.Type = T_Null;
145 break;
146 case T_Array:
147 createjson::Array(std::move(M.asjson::Array()));
148 M.Type = T_Null;
149 break;
150 }
151}
152
153void Value::destroy() {
154 switch (Type) {
155 case T_Null:
156 case T_Boolean:
157 case T_Double:
158 case T_Integer:
159 case T_UINT64:
160 break;
161 case T_StringRef:
162 as().~StringRef();
163 break;
164 case T_String:
165 asstd::string().~basic_string();
166 break;
167 case T_Object:
168 asjson::Object().~Object();
169 break;
170 case T_Array:
171 asjson::Array().~Array();
172 break;
173 }
174}
175
177
179 if (L.kind() != R.kind())
180 return false;
181 switch (L.kind()) {
183 return *L.getAsNull() == *R.getAsNull();
185 return *L.getAsBoolean() == *R.getAsBoolean();
187
188
189
190
191 if (L.Type == Value::T_Integer || R.Type == Value::T_Integer)
192 return L.getAsInteger() == R.getAsInteger();
193 return *L.getAsNumber() == *R.getAsNumber();
195 return *L.getAsString() == *R.getAsString();
197 return *L.getAsArray() == *R.getAsArray();
199 return *L.getAsObject() == *R.getAsObject();
200 }
202}
203
205
206 unsigned Count = 0;
208 for (P = this; P->Parent != nullptr; P = P->Parent)
211
212 R->ErrorMessage = Msg;
213 R->ErrorPath.resize(Count);
214 auto It = R->ErrorPath.begin();
215 for (P = this; P->Parent != nullptr; P = P->Parent)
216 *It++ = P->Seg;
217}
218
220 std::string S;
222 OS << (ErrorMessage.empty() ? "invalid JSON contents" : ErrorMessage);
223 if (ErrorPath.empty()) {
224 if (!Name.empty())
225 OS << " when parsing " << Name;
226 } else {
227 OS << " at " << (Name.empty() ? "(root)" : Name);
228 for (const Path::Segment &S : llvm::reverse(ErrorPath)) {
229 if (S.isField())
230 OS << '.' << S.field();
231 else
232 OS << '[' << S.index() << ']';
233 }
234 }
236}
237
239 std::vector<const Object::value_type *> Elements;
240 for (const auto &E : O)
241 Elements.push_back(&E);
244 return L->first < R->first;
245 });
246 return Elements;
247}
248
249
250
251
253 switch (V.kind()) {
255 JOS.rawValue(V.getAsArray()->empty() ? "[]" : "[ ... ]");
256 break;
258 JOS.rawValue(V.getAsObject()->empty() ? "{}" : "{ ... }");
259 break;
262 if (S.size() < 40) {
264 } else {
266 Truncated.append("...");
267 JOS.value(Truncated);
268 }
269 break;
270 }
271 default:
273 }
274}
275
276
277
279 switch (V.kind()) {
282 for (const auto &I : *V.getAsArray())
284 });
285 break;
288 for (const auto *KV : sortedElements(*V.getAsObject())) {
292 }
293 });
294 break;
295 default:
297 }
298}
299
301 OStream JOS(OS, 2);
302
303
304
305
307
308
309
310 auto HighlightCurrent = [&] {
311 std::string Comment = "error: ";
312 Comment.append(ErrorMessage.data(), ErrorMessage.size());
315 };
316 if (Path.empty())
317 return HighlightCurrent();
318 const Segment &S = Path.back();
319 if (S.isField()) {
320
322 const Object *O = V.getAsObject();
323 if (!O || !O->get(FieldName))
324 return HighlightCurrent();
328 if (FieldName == StringRef(KV->first))
329 Recurse(KV->second, Path.drop_back(), Recurse);
330 else
333 }
334 });
335 } else {
336
337 const Array *A = V.getAsArray();
338 if ( || S.index() >= A->size())
339 return HighlightCurrent();
341 unsigned Current = 0;
342 for (const auto &V : *A) {
343 if (Current++ == S.index())
344 Recurse(V, Path.drop_back(), Recurse);
345 else
347 }
348 });
349 }
350 };
351 PrintValue(R, ErrorPath, PrintValue);
352}
353
354namespace {
355
356class Parser {
357public:
359 : Start(JSON.begin()), P(JSON.begin()), End(JSON.end()) {}
360
361 bool checkUTF8() {
362 size_t ErrOffset;
364 return true;
365 P = Start + ErrOffset;
366 return parseError("Invalid UTF-8 sequence");
367 }
368
369 bool parseValue(Value &Out);
370
371 bool assertEnd() {
372 eatWhitespace();
373 if (P == End)
374 return true;
375 return parseError("Text after end of document");
376 }
377
378 Error takeError() {
380 return std::move(*Err);
381 }
382
383private:
384 void eatWhitespace() {
385 while (P != End && (*P == ' ' || *P == '\r' || *P == '\n' || *P == '\t'))
386 ++P;
387 }
388
389
390 bool parseNumber(char First, Value &Out);
391 bool parseString(std::string &Out);
392 bool parseUnicode(std::string &Out);
393 bool parseError(const char *Msg);
394
395 char next() { return P == End ? 0 : *P++; }
396 char peek() { return P == End ? 0 : *P; }
397 static bool isNumber(char C) {
398 return C == '0' || C == '1' || C == '2' || C == '3' || C == '4' ||
399 C == '5' || C == '6' || C == '7' || C == '8' || C == '9' ||
400 C == 'e' || C == 'E' || C == '+' || C == '-' || C == '.';
401 }
402
403 std::optional Err;
404 const char *Start, *P, *End;
405};
406}
407
408bool Parser::parseValue(Value &Out) {
409 eatWhitespace();
410 if (P == End)
411 return parseError("Unexpected EOF");
412 switch (char C = next()) {
413
414 case 'n':
415 Out = nullptr;
416 return (next() == 'u' && next() == 'l' && next() == 'l') ||
417 parseError("Invalid JSON value (null?)");
418 case 't':
419 Out = true;
420 return (next() == 'r' && next() == 'u' && next() == 'e') ||
421 parseError("Invalid JSON value (true?)");
422 case 'f':
423 Out = false;
424 return (next() == 'a' && next() == 'l' && next() == 's' && next() == 'e') ||
425 parseError("Invalid JSON value (false?)");
426 case '"': {
427 std::string S;
428 if (parseString(S)) {
429 Out = std::move(S);
430 return true;
431 }
432 return false;
433 }
434 case '[': {
436 Array &A = *Out.getAsArray();
437 eatWhitespace();
438 if (peek() == ']') {
439 ++P;
440 return true;
441 }
442 for (;;) {
443 A.emplace_back(nullptr);
444 if (!parseValue(A.back()))
445 return false;
446 eatWhitespace();
447 switch (next()) {
448 case ',':
449 eatWhitespace();
450 continue;
451 case ']':
452 return true;
453 default:
454 return parseError("Expected , or ] after array element");
455 }
456 }
457 }
458 case '{': {
460 Object &O = *Out.getAsObject();
461 eatWhitespace();
462 if (peek() == '}') {
463 ++P;
464 return true;
465 }
466 for (;;) {
467 if (next() != '"')
468 return parseError("Expected object key");
469 std::string K;
470 if (!parseString(K))
471 return false;
472 eatWhitespace();
473 if (next() != ':')
474 return parseError("Expected : after object key");
475 eatWhitespace();
476 if (!parseValue(O[std::move(K)]))
477 return false;
478 eatWhitespace();
479 switch (next()) {
480 case ',':
481 eatWhitespace();
482 continue;
483 case '}':
484 return true;
485 default:
486 return parseError("Expected , or } after object property");
487 }
488 }
489 }
490 default:
491 if (isNumber(C))
492 return parseNumber(C, Out);
493 return parseError("Invalid JSON value");
494 }
495}
496
497bool Parser::parseNumber(char First, Value &Out) {
498
499 SmallString<24> S;
500 S.push_back(First);
501 while (isNumber(peek()))
502 S.push_back(next());
503 char *End;
504
505
506
507 errno = 0;
508 int64_t I = std::strtoll(S.c_str(), &End, 10);
509 if (End == S.end() && errno != ERANGE) {
510 Out = I;
511 return true;
512 }
513
514
515
516 if (First != '-') {
517 errno = 0;
518 uint64_t UI = std::strtoull(S.c_str(), &End, 10);
519 if (End == S.end() && errno != ERANGE) {
520 Out = UI;
521 return true;
522 }
523 }
524
525 Out = std::strtod(S.c_str(), &End);
526 return End == S.end() || parseError("Invalid JSON value (number?)");
527}
528
529bool Parser::parseString(std::string &Out) {
530
531 for (char C = next(); C != '"'; C = next()) {
533 return parseError("Unterminated string");
535 return parseError("Control character in string");
537 Out.push_back(C);
538 continue;
539 }
540
541 switch (C = next()) {
542 case '"':
543 case '\\':
544 case '/':
545 Out.push_back(C);
546 break;
547 case 'b':
548 Out.push_back('\b');
549 break;
550 case 'f':
551 Out.push_back('\f');
552 break;
553 case 'n':
554 Out.push_back('\n');
555 break;
556 case 'r':
557 Out.push_back('\r');
558 break;
559 case 't':
560 Out.push_back('\t');
561 break;
562 case 'u':
563 if (!parseUnicode(Out))
564 return false;
565 break;
566 default:
567 return parseError("Invalid escape sequence");
568 }
569 }
570 return true;
571}
572
574 if (Rune < 0x80) {
575 Out.push_back(Rune & 0x7F);
576 } else if (Rune < 0x800) {
577 uint8_t FirstByte = 0xC0 | ((Rune & 0x7C0) >> 6);
578 uint8_t SecondByte = 0x80 | (Rune & 0x3F);
579 Out.push_back(FirstByte);
580 Out.push_back(SecondByte);
581 } else if (Rune < 0x10000) {
582 uint8_t FirstByte = 0xE0 | ((Rune & 0xF000) >> 12);
583 uint8_t SecondByte = 0x80 | ((Rune & 0xFC0) >> 6);
584 uint8_t ThirdByte = 0x80 | (Rune & 0x3F);
585 Out.push_back(FirstByte);
586 Out.push_back(SecondByte);
587 Out.push_back(ThirdByte);
588 } else if (Rune < 0x110000) {
589 uint8_t FirstByte = 0xF0 | ((Rune & 0x1F0000) >> 18);
590 uint8_t SecondByte = 0x80 | ((Rune & 0x3F000) >> 12);
591 uint8_t ThirdByte = 0x80 | ((Rune & 0xFC0) >> 6);
592 uint8_t FourthByte = 0x80 | (Rune & 0x3F);
593 Out.push_back(FirstByte);
594 Out.push_back(SecondByte);
595 Out.push_back(ThirdByte);
596 Out.push_back(FourthByte);
597 } else {
599 }
600}
601
602
603
604
605
606bool Parser::parseUnicode(std::string &Out) {
607
608 auto Invalid = [&] { Out.append( {'\xef', '\xbf', '\xbd'}); };
609
610 auto Parse4Hex = [this](uint16_t &Out) -> bool {
611 Out = 0;
612 char Bytes[] = {next(), next(), next(), next()};
613 for (unsigned char C : Bytes) {
614 if (!std::isxdigit(C))
615 return parseError("Invalid \\u escape sequence");
616 Out <<= 4;
617 Out |= (C > '9') ? (C & ~0x20) - 'A' + 10 : (C - '0');
618 }
619 return true;
620 };
621 uint16_t First;
622 if (!Parse4Hex(First))
623 return false;
624
625
626 while (true) {
627
630 return true;
631 }
632
633
636 return true;
637 }
638
639
640
641 if (LLVM_UNLIKELY(P + 2 > End || *P != '\\' || *(P + 1) != 'u')) {
642 Invalid();
643 return true;
644 }
645 P += 2;
646 uint16_t Second;
647 if (!Parse4Hex(Second))
648 return false;
649
650 if (LLVM_UNLIKELY(Second < 0xDC00 || Second >= 0xE000)) {
651 Invalid();
652 First = Second;
653 continue;
654 }
655
656 encodeUtf8(0x10000 | ((First - 0xD800) << 10) | (Second - 0xDC00), Out);
657 return true;
658 }
659}
660
661bool Parser::parseError(const char *Msg) {
662 int Line = 1;
663 const char *StartOfLine = Start;
664 for (const char *X = Start; X < P; ++X) {
665 if (*X == 0x0A) {
667 StartOfLine = X + 1;
668 }
669 }
670 Err.emplace(
671 std::make_unique(Msg, Line, P - StartOfLine, P - Start));
672 return false;
673}
674
676 Parser P(JSON);
678 if (P.checkUTF8())
680 if (P.assertEnd())
681 return std::move(E);
682 return P.takeError();
683}
685
687
689 return true;
690
693 return true;
694
695 if (ErrOffset)
696 *ErrOffset = Rest - Data;
697 return false;
698}
699
701
702 std::vector Codepoints(S.size());
703 const UTF8 *In8 = reinterpret_cast<const UTF8 *>(S.data());
704 UTF32 *Out32 = Codepoints.data();
707 Codepoints.resize(Out32 - Codepoints.data());
708 std::string Res(4 * Codepoints.size(), 0);
709 const UTF32 *In32 = Codepoints.data();
710 UTF8 *Out8 = reinterpret_cast<UTF8 *>(&Res[0]);
711 ConvertUTF32toUTF8(&In32, In32 + Codepoints.size(), &Out8, Out8 + Res.size(),
713 Res.resize(reinterpret_cast<char *>(Out8) - Res.data());
714 return Res;
715}
716
718 OS << '\"';
719 for (unsigned char C : S) {
720 if (C == 0x22 || C == 0x5C)
721 OS << '\\';
722 if (C >= 0x20) {
723 OS << C;
724 continue;
725 }
726 OS << '\\';
727 switch (C) {
728
729 case '\t':
730 OS << 't';
731 break;
732 case '\n':
733 OS << 'n';
734 break;
735 case '\r':
736 OS << 'r';
737 break;
738 default:
739 OS << 'u';
741 break;
742 }
743 }
744 OS << '\"';
745}
746
748 switch (V.kind()) {
750 valueBegin();
751 OS << "null";
752 return;
754 valueBegin();
755 OS << (*V.getAsBoolean() ? "true" : "false");
756 return;
758 valueBegin();
759 if (V.Type == Value::T_Integer)
760 OS << *V.getAsInteger();
761 else if (V.Type == Value::T_UINT64)
762 OS << *V.getAsUINT64();
763 else
764 OS << format("%.*g", std::numeric_limits::max_digits10,
765 *V.getAsNumber());
766 return;
768 valueBegin();
769 quote(OS, *V.getAsString());
770 return;
772 return array([&] {
773 for (const Value &E : *V.getAsArray())
775 });
780 });
781 }
782}
783
784void llvm::json::OStream::valueBegin() {
785 assert(Stack.back().Ctx != Object && "Only attributes allowed here");
786 if (Stack.back().HasValue) {
787 assert(Stack.back().Ctx != Singleton && "Only one value allowed here");
788 OS << ',';
789 }
790 if (Stack.back().Ctx == Array)
791 newline();
792 flushComment();
793 Stack.back().HasValue = true;
794}
795
797 assert(PendingComment.empty() && "Only one comment per value!");
798 PendingComment = Comment;
799}
800
801void OStream::flushComment() {
802 if (PendingComment.empty())
803 return;
804 OS << (IndentSize ? "/* " : "/*");
805
806 while (!PendingComment.empty()) {
807 auto Pos = PendingComment.find("*/");
809 OS << PendingComment;
810 PendingComment = "";
811 } else {
812 OS << PendingComment.take_front(Pos) << "* /";
813 PendingComment = PendingComment.drop_front(Pos + 2);
814 }
815 }
816 OS << (IndentSize ? " */" : "*/");
817
818 if (Stack.size() > 1 && Stack.back().Ctx == Singleton) {
819 if (IndentSize)
820 OS << ' ';
821 } else {
822 newline();
823 }
824}
825
826void llvm::json::OStream::newline() {
827 if (IndentSize) {
828 OS.write('\n');
829 OS.indent(Indent);
830 }
831}
832
834 valueBegin();
835 Stack.emplace_back();
836 Stack.back().Ctx = Array;
837 Indent += IndentSize;
838 OS << '[';
839}
840
842 assert(Stack.back().Ctx == Array);
843 Indent -= IndentSize;
844 if (Stack.back().HasValue)
845 newline();
846 OS << ']';
847 assert(PendingComment.empty());
848 Stack.pop_back();
849 assert(!Stack.empty());
850}
851
853 valueBegin();
854 Stack.emplace_back();
855 Stack.back().Ctx = Object;
856 Indent += IndentSize;
857 OS << '{';
858}
859
861 assert(Stack.back().Ctx == Object);
862 Indent -= IndentSize;
863 if (Stack.back().HasValue)
864 newline();
865 OS << '}';
866 assert(PendingComment.empty());
867 Stack.pop_back();
868 assert(!Stack.empty());
869}
870
872 assert(Stack.back().Ctx == Object);
873 if (Stack.back().HasValue)
874 OS << ',';
875 newline();
876 flushComment();
877 Stack.back().HasValue = true;
878 Stack.emplace_back();
879 Stack.back().Ctx = Singleton;
882 } else {
883 assert(false && "Invalid UTF-8 in attribute key");
885 }
886 OS.write(':');
887 if (IndentSize)
888 OS.write(' ');
889}
890
892 assert(Stack.back().Ctx == Singleton);
893 assert(Stack.back().HasValue && "Attribute must have a value");
894 assert(PendingComment.empty());
895 Stack.pop_back();
896 assert(Stack.back().Ctx == Object);
897}
898
900 valueBegin();
901 Stack.emplace_back();
902 Stack.back().Ctx = RawValue;
903 return OS;
904}
905
907 assert(Stack.back().Ctx == RawValue);
908 Stack.pop_back();
909}
910
911}
912}
913
916 unsigned IndentAmount = 0;
917 if (.empty() && Options.getAsInteger(10, IndentAmount))
918 llvm_unreachable("json::Value format options should be an integer");
920}
921
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
#define LLVM_UNLIKELY(EXPR)
#define LLVM_LIKELY(EXPR)
This file supports working with JSON data.
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
static bool peek(struct InternalInstruction *insn, uint8_t &byte)
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Lightweight error class with error context and mandatory checking.
Tagged union holding either a T or a Error.
A wrapper around a string literal that serves as a proxy for constructing global tables of StringRefs...
StringRef - Represent a constant reference to a string, i.e.
static constexpr size_t npos
constexpr size_t size() const
size - Get the string size.
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
StringRef take_front(size_t N=1) const
Return a StringRef equal to 'this' but with only the first N elements remaining.
The instances of the Type class are immutable: once they are created, they are never changed.
Type(LLVMContext &C, TypeID tid)
LLVM Value Representation.
An Array is a JSON array, which contains heterogeneous JSON values.
void emplace_back(Args &&...A)
json::OStream allows writing well-formed JSON without materializing all structures as json::Value ahe...
void object(Block Contents)
Emit an object whose elements are emitted in the provided Block.
void rawValue(llvm::function_ref< void(raw_ostream &)> Contents)
Emit an externally-serialized value.
LLVM_ABI void attributeBegin(llvm::StringRef Key)
Definition JSON.cpp:871
void attribute(llvm::StringRef Key, const Value &Contents)
Emit an attribute whose value is self-contained (number, vector etc).
LLVM_ABI void arrayBegin()
Definition JSON.cpp:833
LLVM_ABI void objectBegin()
Definition JSON.cpp:852
LLVM_ABI raw_ostream & rawValueBegin()
Definition JSON.cpp:899
LLVM_ABI void comment(llvm::StringRef)
Emit a JavaScript comment associated with the next printed value.
Definition JSON.cpp:796
void array(Block Contents)
Emit an array whose elements are emitted in the provided Block.
LLVM_ABI void arrayEnd()
Definition JSON.cpp:841
LLVM_ABI void attributeEnd()
Definition JSON.cpp:891
LLVM_ABI void value(const Value &V)
Emit a self-contained value (number, string, vector etc).
Definition JSON.cpp:747
LLVM_ABI void rawValueEnd()
Definition JSON.cpp:906
LLVM_ABI void objectEnd()
Definition JSON.cpp:860
ObjectKey is a used to capture keys in Object.
An Object is a JSON object, which maps strings to heterogenous JSON values.
LLVM_ABI std::optional< bool > getBoolean(StringRef K) const
Definition JSON.cpp:47
LLVM_ABI Value & operator[](const ObjectKey &K)
Definition JSON.cpp:24
LLVM_ABI std::optional< double > getNumber(StringRef K) const
Definition JSON.cpp:52
LLVM_ABI const json::Object * getObject(StringRef K) const
Definition JSON.cpp:67
LLVM_ABI std::optional< llvm::StringRef > getString(StringRef K) const
Definition JSON.cpp:62
Storage::value_type value_type
LLVM_ABI Value * get(StringRef K)
Definition JSON.cpp:30
LLVM_ABI std::optional< int64_t > getInteger(StringRef K) const
Definition JSON.cpp:57
LLVM_ABI std::optional< std::nullptr_t > getNull(StringRef K) const
Definition JSON.cpp:42
std::pair< iterator, bool > try_emplace(const ObjectKey &K, Ts &&... Args)
iterator find(StringRef K)
LLVM_ABI const json::Array * getArray(StringRef K) const
Definition JSON.cpp:77
The root is the trivial Path to the root value.
LLVM_ABI void printErrorContext(const Value &, llvm::raw_ostream &) const
Print the root value with the error shown inline as a comment.
Definition JSON.cpp:300
LLVM_ABI Error getError() const
Returns the last error reported, or else a generic error.
Definition JSON.cpp:219
LLVM_ABI void report(llvm::StringLiteral Message)
Records that the value at the current path is invalid.
Definition JSON.cpp:204
Path(Root &R)
The root may be treated as a Path.
A Value is an JSON value of unknown type.
LLVM_ABI void print(llvm::raw_ostream &OS) const
Definition JSON.cpp:176
@ Number
Number values can store both int64s and doubles at full precision, depending on what they were constr...
This class implements an extremely fast bulk output stream that can only output to a stream.
A raw_ostream that writes to an std::string.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
static void abbreviateChildren(const Value &V, OStream &JOS)
Definition JSON.cpp:278
LLVM_ABI llvm::Expected< Value > parse(llvm::StringRef JSON)
Parses the provided JSON source, or returns a ParseError.
Definition JSON.cpp:675
static void abbreviate(const Value &V, OStream &JOS)
Definition JSON.cpp:252
LLVM_ABI bool operator==(const Object &LHS, const Object &RHS)
Definition JSON.cpp:87
LLVM_ABI bool isUTF8(llvm::StringRef S, size_t *ErrOffset=nullptr)
Returns true if S is valid UTF-8, which is required for use as JSON.
Definition JSON.cpp:686
LLVM_ABI std::vector< const Object::value_type * > sortedElements(const Object &O)
Definition JSON.cpp:238
static void quote(llvm::raw_ostream &OS, llvm::StringRef S)
Definition JSON.cpp:717
LLVM_ABI std::string fixUTF8(llvm::StringRef S)
Replaces invalid UTF-8 sequences in S with the replacement character (U+FFFD).
Definition JSON.cpp:700
static void encodeUtf8(uint32_t Rune, std::string &Out)
Definition JSON.cpp:573
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value
LLVM_ABI ConversionResult ConvertUTF8toUTF32(const UTF8 **sourceStart, const UTF8 *sourceEnd, UTF32 **targetStart, UTF32 *targetEnd, ConversionFlags flags)
Convert a partial UTF8 sequence to UTF32.
LLVM_ABI std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
auto reverse(ContainerTy &&C)
void sort(IteratorTy Start, IteratorTy End)
FunctionAddr VTableAddr Count
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
FunctionAddr VTableAddr uintptr_t uintptr_t Data
LLVM_ABI void write_hex(raw_ostream &S, uint64_t N, HexPrintStyle Style, std::optional< size_t > Width=std::nullopt)
LLVM_ABI ConversionResult ConvertUTF32toUTF8(const UTF32 **sourceStart, const UTF32 *sourceEnd, UTF8 **targetStart, UTF8 *targetEnd, ConversionFlags flags)
bool isASCII(char C)
Checks whether character C is valid ASCII (high bit is zero).
LLVM_ABI Boolean isLegalUTF8String(const UTF8 **source, const UTF8 *sourceEnd)