1*81ad6265SDimitry Andric //===- DWARFTypePrinter.h ---------------------------------------*- C++ -*-===// 2*81ad6265SDimitry Andric // 3*81ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*81ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*81ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*81ad6265SDimitry Andric // 7*81ad6265SDimitry Andric //===----------------------------------------------------------------------===// 8*81ad6265SDimitry Andric 9*81ad6265SDimitry Andric #ifndef LLVM_DEBUGINFO_DWARF_DWARFTYPEPRINTER_H 10*81ad6265SDimitry Andric #define LLVM_DEBUGINFO_DWARF_DWARFTYPEPRINTER_H 11*81ad6265SDimitry Andric 12*81ad6265SDimitry Andric #include "llvm/ADT/StringRef.h" 13*81ad6265SDimitry Andric #include "llvm/BinaryFormat/Dwarf.h" 14*81ad6265SDimitry Andric #include "llvm/DebugInfo/DWARF/DWARFDie.h" 15*81ad6265SDimitry Andric 16*81ad6265SDimitry Andric #include <string> 17*81ad6265SDimitry Andric 18*81ad6265SDimitry Andric namespace llvm { 19*81ad6265SDimitry Andric 20*81ad6265SDimitry Andric class raw_ostream; 21*81ad6265SDimitry Andric 22*81ad6265SDimitry Andric // FIXME: We should have pretty printers per language. Currently we print 23*81ad6265SDimitry Andric // everything as if it was C++ and fall back to the TAG type name. 24*81ad6265SDimitry Andric struct DWARFTypePrinter { 25*81ad6265SDimitry Andric raw_ostream &OS; 26*81ad6265SDimitry Andric bool Word = true; 27*81ad6265SDimitry Andric bool EndedWithTemplate = false; 28*81ad6265SDimitry Andric DWARFTypePrinterDWARFTypePrinter29*81ad6265SDimitry Andric DWARFTypePrinter(raw_ostream &OS) : OS(OS) {} 30*81ad6265SDimitry Andric 31*81ad6265SDimitry Andric /// Dump the name encoded in the type tag. 32*81ad6265SDimitry Andric void appendTypeTagName(dwarf::Tag T); 33*81ad6265SDimitry Andric 34*81ad6265SDimitry Andric void appendArrayType(const DWARFDie &D); 35*81ad6265SDimitry Andric 36*81ad6265SDimitry Andric DWARFDie skipQualifiers(DWARFDie D); 37*81ad6265SDimitry Andric 38*81ad6265SDimitry Andric bool needsParens(DWARFDie D); 39*81ad6265SDimitry Andric 40*81ad6265SDimitry Andric void appendPointerLikeTypeBefore(DWARFDie D, DWARFDie Inner, StringRef Ptr); 41*81ad6265SDimitry Andric 42*81ad6265SDimitry Andric DWARFDie appendUnqualifiedNameBefore(DWARFDie D, 43*81ad6265SDimitry Andric std::string *OriginalFullName = nullptr); 44*81ad6265SDimitry Andric 45*81ad6265SDimitry Andric void appendUnqualifiedNameAfter(DWARFDie D, DWARFDie Inner, 46*81ad6265SDimitry Andric bool SkipFirstParamIfArtificial = false); 47*81ad6265SDimitry Andric void appendQualifiedName(DWARFDie D); 48*81ad6265SDimitry Andric DWARFDie appendQualifiedNameBefore(DWARFDie D); 49*81ad6265SDimitry Andric bool appendTemplateParameters(DWARFDie D, bool *FirstParameter = nullptr); 50*81ad6265SDimitry Andric void decomposeConstVolatile(DWARFDie &N, DWARFDie &T, DWARFDie &C, 51*81ad6265SDimitry Andric DWARFDie &V); 52*81ad6265SDimitry Andric void appendConstVolatileQualifierAfter(DWARFDie N); 53*81ad6265SDimitry Andric void appendConstVolatileQualifierBefore(DWARFDie N); 54*81ad6265SDimitry Andric 55*81ad6265SDimitry Andric /// Recursively append the DIE type name when applicable. 56*81ad6265SDimitry Andric void appendUnqualifiedName(DWARFDie D, 57*81ad6265SDimitry Andric std::string *OriginalFullName = nullptr); 58*81ad6265SDimitry Andric 59*81ad6265SDimitry Andric void appendSubroutineNameAfter(DWARFDie D, DWARFDie Inner, 60*81ad6265SDimitry Andric bool SkipFirstParamIfArtificial, bool Const, 61*81ad6265SDimitry Andric bool Volatile); 62*81ad6265SDimitry Andric void appendScopes(DWARFDie D); 63*81ad6265SDimitry Andric }; 64*81ad6265SDimitry Andric 65*81ad6265SDimitry Andric } // namespace llvm 66*81ad6265SDimitry Andric 67*81ad6265SDimitry Andric #endif // LLVM_DEBUGINFO_DWARF_DWARFTYPEPRINTER_H 68