clang: lib/Interpreter/InterpreterValuePrinter.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
24
25#include "llvm/Support/Error.h"
26#include "llvm/Support/raw_ostream.h"
27
28#include
29#include
30#include
31#include
32#include
33
34#define DEBUG_TYPE "interp-value"
35
36using namespace clang;
37
39 std::string Str;
40 llvm::raw_string_ostream SS(Str);
44 return Str;
45}
46
49
52
54
55 struct LocalPrintingPolicyRAII {
58
61 Context.setPrintingPolicy(PP);
62 }
63 ~LocalPrintingPolicyRAII() { Context.setPrintingPolicy(Policy); }
64 } X(Ctx, Policy);
65
67
68 if (const auto *TTy = llvm::dyn_cast(NonRefTy))
70
71 if (const auto *TRy = dyn_cast(NonRefTy))
73
75
76
80
81 if (const auto *TDTy = dyn_cast(NonRefTy)) {
82
83
84
85
86
87
88
90 if (llvm::isa(SSDesugar))
92 else if (llvm::isa(SSDesugar))
95 }
97}
98
100 std::string Str;
101 llvm::raw_string_ostream SS(Str);
103
104 uint64_t Data = V.convertTo<uint64_t>();
107
108 auto *ED = V.getType()->castAsEnumDecl();
109 for (auto I = ED->enumerator_begin(), E = ED->enumerator_end(); I != E; ++I) {
110 if (I->getInitVal() == AP) {
112 SS << " ? ";
113 SS << "(" + I->getQualifiedNameAsString() << ")";
115 }
116 }
118 AP.toString(APStr, 10);
119 SS << " : " << QualTypeToString(Ctx, ED->getIntegerType()) << " " << APStr;
120 return Str;
121}
122
124 std::string Str;
125 llvm::raw_string_ostream SS(Str);
126 SS << "Function @" << Ptr;
127
128 const DeclContext *PTU = V.getASTContext().getTranslationUnitDecl();
129
130
135
136
137
139 if (auto *InterfaceCall = llvm::dyn_cast(TLSD->getStmt())) {
140 const auto *Arg = InterfaceCall->getArg( 3);
141
142 while (const CastExpr *CastE = llvm::dyn_cast(Arg))
143 Arg = CastE->getSubExpr();
144 if (const DeclRefExpr *DeclRefExp = llvm::dyn_cast(Arg))
145 FD = llvm::dyn_cast(DeclRefExp->getDecl());
146
147 if (FD) {
148 SS << '\n';
152 }
153 }
154 return Str;
155}
156
158 std::string Str;
159 llvm::raw_string_ostream SS(Str);
160 SS << Ptr;
161 return Str;
162}
163
165 if (!Ptr)
166 return "0";
167
168 std::string Result = "\"";
169 Result += Ptr;
170 Result += '"';
171 return Result;
172}
173
175
182
183std::string Interpreter::ValueDataToString(const Value &V) const {
186
188
190 QualType ElemTy = CAT->getElementType();
194
195
197 char last = *(char *)(((uintptr_t)V.getPtr()) + ElemCount * ElemSize - 1);
198 if (last == '\0')
200 }
201
202 std::string Result = "{ ";
203 for (unsigned Idx = 0, N = CAT->getZExtSize(); Idx < N; ++Idx) {
204 ValueRef InnerV = ValueRef(this, ElemTy.getAsOpaquePtr());
206
208 InnerV.setRawBits((void *)Offset, ElemSize * 8);
209 } else {
210
211 size_t Stride = ElemCount / N;
213 InnerV.setPtr((void *)Offset);
214 }
215
216 Result += ValueDataToString(InnerV);
217
218
219 if (Idx < N - 1)
221 }
224 }
225
228
229
230
231
232
233
234
236
237 auto formatFloating = [](auto Val, char Suffix = '\0') -> std::string {
238 std::string Out;
239 llvm::raw_string_ostream SS(Out);
240
242 SS << llvm::format("%g", Val);
243 return SS.str();
244 }
245 if (Val == static_cast<decltype(Val)>(static_cast<int64_t>(Val)))
246 SS << llvm::format("%.1f", Val);
247 else if (std::abs(Val) < 1e-4 || std::abs(Val) > 1e6 || Suffix == 'f')
248 SS << llvm::format("%#.6g", Val);
249 else if (Suffix == 'L')
250 SS << llvm::format("%#.12Lg", Val);
251 else
252 SS << llvm::format("%#.8g", Val);
253
254 if (Suffix != '\0')
255 SS << Suffix;
256 return SS.str();
257 };
258
259 std::string Str;
260 llvm::raw_string_ostream SS(Str);
261 switch (BT->getKind()) {
262 default:
263 return "{ error: unknown builtin type '" + std::to_string(BT->getKind()) +
264 " '}";
265 case clang::BuiltinType::Bool:
266 SS << ((V.getBool()) ? "true" : "false");
267 return Str;
268 case clang::BuiltinType::Char_S:
269 SS << '\'' << V.getChar_S() << '\'';
270 return Str;
271 case clang::BuiltinType::SChar:
272 SS << '\'' << V.getSChar() << '\'';
273 return Str;
274 case clang::BuiltinType::Char_U:
275 SS << '\'' << V.getChar_U() << '\'';
276 return Str;
277 case clang::BuiltinType::UChar:
278 SS << '\'' << V.getUChar() << '\'';
279 return Str;
280 case clang::BuiltinType::Short:
281 SS << V.getShort();
282 return Str;
283 case clang::BuiltinType::UShort:
284 SS << V.getUShort();
285 return Str;
286 case clang::BuiltinType::Int:
287 SS << V.getInt();
288 return Str;
289 case clang::BuiltinType::UInt:
290 SS << V.getUInt();
291 return Str;
292 case clang::BuiltinType::Long:
293 SS << V.getLong();
294 return Str;
295 case clang::BuiltinType::ULong:
296 SS << V.getULong();
297 return Str;
298 case clang::BuiltinType::LongLong:
299 SS << V.getLongLong();
300 return Str;
301 case clang::BuiltinType::ULongLong:
302 SS << V.getULongLong();
303 return Str;
304 case clang::BuiltinType::Float:
305 return formatFloating(V.getFloat(), 'f');
306
307 case clang::BuiltinType::Double:
308 return formatFloating(V.getDouble());
309
310 case clang::BuiltinType::LongDouble:
311 return formatFloating(V.getLongDouble(), 'L');
312 }
313 }
314
318
321
324
326 return "nullptr\n";
327
328
332
334 }
335
336
338}
339
340std::string Interpreter::ValueTypeToString(const Value &V) const {
341 ASTContext &Ctx = const_cast<ASTContext &>(V.getASTContext());
342 QualType QT = V.getType();
343
345
347 QTStr += " &";
348
349 return QTStr;
350}
351
353Interpreter::CompileDtorCall(CXXRecordDecl *CXXRD) const {
354 assert(CXXRD && "Cannot compile a destructor for a nullptr");
355 if (auto Dtor = Dtors.find(CXXRD); Dtor != Dtors.end())
356 return Dtor->getSecond();
357
359 return llvm::orc::ExecutorAddr{};
360
361 CXXDestructorDecl *DtorRD =
363
364 llvm::StringRef Name =
365 Act->getCodeGen()->GetMangledName(GlobalDecl(DtorRD, Dtor_Base));
367 if (!AddrOrErr)
368 return AddrOrErr.takeError();
369
370 Dtors[CXXRD] = *AddrOrErr;
371 return AddrOrErr;
372}
373
375
377 : public TypeVisitor<InterfaceKindVisitor, InterfaceKind> {
378
382
383public:
385 : S(S), E(E), Args(Args) {}
386
390
394
398
402
404 HandlePtrType(Ty);
406 }
407
409 HandlePtrType(Ty);
411 }
412
415 E->IgnoreImpCasts());
416 assert(!AddrOfE.isInvalid() && "Can not create unary expression");
417 Args.push_back(AddrOfE.get());
419 }
420
423 Args.push_back(E);
425 Args.push_back(E);
427 HandleIntegralOrEnumType(Ty);
429
430 }
431
433 }
434
436 HandleIntegralOrEnumType(Ty);
438 }
439
440private:
441
442
443 void HandleIntegralOrEnumType(const Type *Ty) {
450 assert(!CastedExpr.isInvalid() && "Cannot create cstyle cast expr");
451 Args.push_back(CastedExpr.get());
452 }
453
454 void HandlePtrType(const Type *Ty) {
459 assert(!CastedExpr.isInvalid() && "Can not create cstyle cast expression");
460 Args.push_back(CastedExpr.get());
461 }
462};
463
464static constexpr llvm::StringRef VPName[] = {
465 "__clang_Interpreter_SetValueNoAlloc",
466 "__clang_Interpreter_SetValueWithAlloc",
467 "__clang_Interpreter_SetValueCopyArr", "__ci_newtag"};
468
469
470
471
472
473
474
475
476
477
478
479
480
481
485
486
487 if (!ValuePrintingInfo[0]) {
488 assert(llvm::all_of(ValuePrintingInfo, [](Expr *E) { return !E; }));
489
490 auto LookupInterface = [&](Expr *&Interface,
491 llvm::StringRef Name) -> llvm::Error {
492 LookupResult R(S, &Ctx.Idents.get(Name), SourceLocation(),
496 if (R.empty())
497 return llvm::make_errorllvm::StringError(
498 Name + " not found!", llvm::inconvertibleErrorCode());
499
500 CXXScopeSpec CSS;
502 return llvm::Error::success();
503 };
504 if (llvm::Error Err =
506 return std::move(Err);
507
508 if (llvm::Error Err =
510 return std::move(Err);
511
512 if (llvm::Error Err =
514 return std::move(Err);
515
517 if (llvm::Error Err =
519 return std::move(Err);
520 }
521 }
522
523 llvm::SmallVector<Expr *, 4> AdjustedArgs;
524
526
527
528 AdjustedArgs.push_back(
530
531
532
533
534 if (auto *EWC = llvm::dyn_cast_if_present(E))
535 E = EWC->getSubExpr();
536
539
540
544 }
545
546 Expr *TypeArg =
548
549 AdjustedArgs.push_back(TypeArg);
550
551
552
553 InterfaceKindVisitor V(S, E, AdjustedArgs);
554 Scope *Scope = nullptr;
557 switch (Kind) {
559 [[fallthrough]];
561
566 return llvm::make_errorllvm::StringError(
568 llvm::inconvertibleErrorCode());
569
571
572
575 Dtor->addAttr(UsedAttr::CreateImplicit(Ctx));
577 DeclGroupRef(Dtor));
578 }
579
580
584
588
590 Expr *Args[] = {E, AllocCall.get(), ArrSizeExpr};
591 SetValueE =
593 SourceLocation(), Args, SourceLocation());
595 return llvm::make_errorllvm::StringError(
597 llvm::inconvertibleErrorCode());
598 break;
599 }
603 true, SourceLocation(), Args,
604 SourceLocation(),
605 SourceRange(), TSI->getType(), TSI, std::nullopt,
607
609 return llvm::make_errorllvm::StringError(
610 "Cannot build a call to placement new",
611 llvm::inconvertibleErrorCode());
612
614 false);
615 break;
616 }
617
619 SetValueE =
622 break;
623 }
624 default:
625 llvm_unreachable("Unhandled InterfaceKind");
626 }
627
628
630 return E;
631
632 return SetValueE.get();
633}
634
635}
636
637using namespace clang;
638
639
640extern "C" {
643 void *OpaqueType) {
646 return VRef.getPtr();
647}
648
651 ...) {
654 VRef = Value(I, OpaqueType);
656 return;
657
659 va_start(args, OpaqueType);
660
664 } else {
666 QT = ED->getIntegerType();
668 default:
669 llvm_unreachable("unknown type kind!");
670 break;
671
672 case BuiltinType::Bool:
673 VRef.setBool(va_arg(args, int));
674 break;
675 case BuiltinType::Char_S:
676 VRef.setChar_S(va_arg(args, int));
677 break;
678 case BuiltinType::SChar:
679 VRef.setSChar(va_arg(args, int));
680 break;
681 case BuiltinType::Char_U:
682 VRef.setChar_U(va_arg(args, unsigned));
683 break;
684 case BuiltinType::UChar:
685 VRef.setUChar(va_arg(args, unsigned));
686 break;
687 case BuiltinType::Short:
688 VRef.setShort(va_arg(args, int));
689 break;
690 case BuiltinType::UShort:
691 VRef.setUShort(va_arg(args, unsigned));
692 break;
693 case BuiltinType::Int:
694 VRef.setInt(va_arg(args, int));
695 break;
696 case BuiltinType::UInt:
697 VRef.setUInt(va_arg(args, unsigned));
698 break;
699 case BuiltinType::Long:
700 VRef.setLong(va_arg(args, long));
701 break;
702 case BuiltinType::ULong:
703 VRef.setULong(va_arg(args, unsigned long));
704 break;
705 case BuiltinType::LongLong:
706 VRef.setLongLong(va_arg(args, long long));
707 break;
708 case BuiltinType::ULongLong:
709 VRef.setULongLong(va_arg(args, unsigned long long));
710 break;
711
712 case BuiltinType::Float:
713 VRef.setFloat(va_arg(args, double));
714 break;
715 case BuiltinType::Double:
716 VRef.setDouble(va_arg(args, double));
717 break;
718 case BuiltinType::LongDouble:
719 VRef.setLongDouble(va_arg(args, long double));
720 break;
721
722 }
723 }
725}
726}
727
728
729
730
731
732
736
737 return operator new(__sz, __p);
738}
Defines the clang::ASTContext interface.
unsigned IsFirst
Indicates that this is the first token of the file.
static std::string EnumToString(const Value &V)
Definition InterpreterValuePrinter.cpp:99
static std::string QualTypeToString(ASTContext &Ctx, QualType QT)
Definition InterpreterValuePrinter.cpp:47
REPL_EXTERNAL_VISIBILITY void * __clang_Interpreter_SetValueWithAlloc(void *This, void *OutVal, void *OpaqueType)
Definition InterpreterValuePrinter.cpp:642
static std::string FunctionToString(const Value &V, const void *Ptr)
Definition InterpreterValuePrinter.cpp:123
static std::string VoidPtrToString(const void *Ptr)
Definition InterpreterValuePrinter.cpp:157
REPL_EXTERNAL_VISIBILITY void __clang_Interpreter_SetValueNoAlloc(void *This, void *OutVal, void *OpaqueType,...)
Definition InterpreterValuePrinter.cpp:650
static std::string DeclTypeToString(const QualType &QT, NamedDecl *D)
Definition InterpreterValuePrinter.cpp:38
static std::string CharPtrToString(const char *Ptr)
Definition InterpreterValuePrinter.cpp:164
#define REPL_EXTERNAL_VISIBILITY
Defines the clang::Preprocessor interface.
@ ForVisibleRedeclaration
The lookup results will be used for redeclaration of a name, if an entity by that name already exists...
C Language Family Type Representation.
#define va_start(ap, param)
__builtin_va_list va_list
static __inline__ uint32_t volatile uint32_t * __p
a trap message and trap category.
virtual bool HandleTopLevelDecl(DeclGroupRef D)
HandleTopLevelDecl - Handle the specified top-level declaration.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
TranslationUnitDecl * getTranslationUnitDecl() const
const ConstantArrayType * getAsConstantArrayType(QualType T) const
QualType getLValueReferenceType(QualType T, bool SpelledAsLValue=true) const
Return the uniqued reference to the type for an lvalue reference to the specified type.
const LangOptions & getLangOpts() const
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
const clang::PrintingPolicy & getPrintingPolicy() const
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
llvm::APSInt MakeIntValue(uint64_t Value, QualType Type) const
Make an APSInt of the appropriate width and signedness for the given Value and integer Type.
uint64_t getConstantArrayElementCount(const ConstantArrayType *CA) const
Return number of constant array elements.
QualType getBitIntType(bool Unsigned, unsigned NumBits) const
Return a bit-precise integer type with the specified signedness and bit count.
This class is used for builtin types like 'int'.
Represents a C++ struct/union/class.
bool hasIrrelevantDestructor() const
Determine whether this class has a destructor which has no semantic effect.
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
ASTConsumer & getASTConsumer() const
Represents the canonical version of C arrays with a specified constant size.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
decl_range noload_decls() const
noload_decls_begin/end - Iterate over the declarations stored in this context that are currently load...
A reference to a declared variable, function, enum, etc.
Decl - This represents one declaration (or definition), e.g.
void print(raw_ostream &Out, unsigned Indentation=0, bool PrintInstantiation=false) const
This represents one expression.
bool isLValue() const
isLValue - True if this expression is an "l-value" according to the rules of the current language.
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
Represents a function declaration or definition.
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
FunctionType - C99 6.7.5.3 - Function Declarators.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
InterfaceKind VisitConstantArrayType(const ConstantArrayType *Ty)
Definition InterpreterValuePrinter.cpp:399
InterfaceKind computeInterfaceKind(QualType Ty)
Definition InterpreterValuePrinter.cpp:387
InterfaceKind VisitReferenceType(const ReferenceType *Ty)
Definition InterpreterValuePrinter.cpp:413
InterfaceKind VisitPointerType(const PointerType *Ty)
Definition InterpreterValuePrinter.cpp:408
InterfaceKind VisitEnumType(const EnumType *Ty)
Definition InterpreterValuePrinter.cpp:435
InterfaceKind VisitBuiltinType(const BuiltinType *Ty)
Definition InterpreterValuePrinter.cpp:421
InterfaceKind VisitFunctionType(const FunctionType *Ty)
Definition InterpreterValuePrinter.cpp:403
InterfaceKind VisitRecordType(const RecordType *Ty)
Definition InterpreterValuePrinter.cpp:391
InterfaceKind VisitMemberPointerType(const MemberPointerType *Ty)
Definition InterpreterValuePrinter.cpp:395
InterfaceKindVisitor(Sema &S, Expr *E, llvm::SmallVectorImpl< Expr * > &Args)
Definition InterpreterValuePrinter.cpp:384
Provides top-level interfaces for incremental compilation and execution.
llvm::Expected< llvm::orc::ExecutorAddr > getSymbolAddress(GlobalDecl GD) const
const CompilerInstance * getCompilerInstance() const
A pointer to member type per C++ 8.3.3 - Pointers to members.
This represents a decl that may have a name.
std::string getQualifiedNameAsString() const
PointerType - C99 6.7.5.1 - Pointer Declarators.
A (possibly-)qualified type.
bool hasQualifiers() const
Determine whether this type has any qualifiers.
QualType getDesugaredType(const ASTContext &Context) const
Return the specified type with any "sugar" removed from the type.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
QualType getCanonicalType() const
void * getAsOpaquePtr() const
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
std::string getAsString() const
Base for LValueReferenceType and RValueReferenceType.
Sema - This implements semantic analysis and AST building for C.
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
ASTContext & getASTContext() const
CXXDestructorDecl * LookupDestructor(CXXRecordDecl *Class)
Look for the destructor of the given class.
ExprResult BuildCXXNew(SourceRange Range, bool UseGlobal, SourceLocation PlacementLParen, MultiExprArg PlacementArgs, SourceLocation PlacementRParen, SourceRange TypeIdParens, QualType AllocType, TypeSourceInfo *AllocTypeInfo, std::optional< Expr * > ArraySize, SourceRange DirectInitRange, Expr *Initializer)
ExprResult BuildCStyleCastExpr(SourceLocation LParenLoc, TypeSourceInfo *Ty, SourceLocation RParenLoc, Expr *Op)
ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R, bool NeedsADL, bool AcceptInvalidDecl=false)
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
ExprResult ActOnCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc, MultiExprArg ArgExprs, SourceLocation RParenLoc, Expr *ExecConfig=nullptr)
ActOnCallExpr - Handle a call to Fn with the specified array of arguments.
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
Encodes a location in the source.
SourceLocation getEndLoc() const LLVM_READONLY
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
A declaration that models statements at global scope.
A container of type source information.
QualType getType() const
Return the type wrapped by this type source info.
InterfaceKind Visit(const Type *T)
The base class of the type hierarchy.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
QualType getLocallyUnqualifiedSingleStepDesugaredType() const
Pull a single level of sugar off of this locally-unqualified type.
bool isFunctionPointerType() const
bool isPointerType() const
const T * castAs() const
Member-template castAs.
bool isReferenceType() const
bool isEnumeralType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
bool isBuiltinType() const
Helper methods to distinguish type categories.
const Type * getBaseElementTypeUnsafe() const
Get the base element type of this type, potentially discarding type qualifiers.
bool isMemberPointerType() const
bool isFunctionProtoType() const
EnumDecl * getAsEnumDecl() const
Retrieves the EnumDecl this type refers to.
bool isFunctionType() const
bool isFloatingType() const
const T * getAs() const
Member-template getAs'.
bool isNullPtrType() const
bool isRecordType() const
void setRawBits(void *Ptr, unsigned NBits=sizeof(Storage))
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
std::string GetFullTypeName(ASTContext &Ctx, QualType QT)
InterfaceKind
Definition InterpreterValuePrinter.cpp:374
@ NewTag
Definition InterpreterValuePrinter.cpp:374
@ NoAlloc
Definition InterpreterValuePrinter.cpp:374
@ WithAlloc
Definition InterpreterValuePrinter.cpp:374
@ CopyArray
Definition InterpreterValuePrinter.cpp:374
@ Result
The result type of a method or function.
IntegerLiteral * IntegerLiteralExpr(ASTContext &C, uint64_t Val)
@ Dtor_Base
Base object dtor.
Expr * CStyleCastPtrExpr(Sema &S, QualType Ty, Expr *E)
U cast(CodeGen::Address addr)
static constexpr llvm::StringRef VPName[]
Definition InterpreterValuePrinter.cpp:464
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
ActionResult< Expr * > ExprResult
__DEVICE__ bool isnan(float __x)
__DEVICE__ _Tp abs(const std::complex< _Tp > &__c)
__DEVICE__ bool isinf(float __x)
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
Describes how types, statements, expressions, and declarations should be printed.
unsigned SuppressUnwrittenScope
Suppress printing parts of scope specifiers that are never written, e.g., for anonymous namespaces.
unsigned SuppressDefaultTemplateArgs
When true, attempt to suppress template arguments that match the default argument for the parameter.
unsigned SplitTemplateClosers
Whether nested templates must be closed like 'a<b >' rather than 'a<b>'.
ValueRef(const Interpreter *In, void *Ty)
Definition InterpreterValuePrinter.cpp:177