[clang] acff0b0 - [clang][Interp][NFC] Improve Record debugging
Timm Bäder via cfe-commits
cfe-commits at lists.llvm.org
Mon Apr 8 22:55:50 PDT 2024
Author: Timm Bäder
Date: 2024-04-09T07:55:36+02:00
New Revision: acff0b03167f877f783d9386014e1ebc20db1c2f
URL: https://github.com/llvm/llvm-project/commit/acff0b03167f877f783d9386014e1ebc20db1c2f
DIFF: https://github.com/llvm/llvm-project/commit/acff0b03167f877f783d9386014e1ebc20db1c2f.diff
LOG: [clang][Interp][NFC] Improve Record debugging
Add Record::dump() and return the diagnostic name from getName()
Added:
Modified:
clang/lib/AST/Interp/Disasm.cpp
clang/lib/AST/Interp/Record.cpp
clang/lib/AST/Interp/Record.h
Removed:
################################################################################
diff --git a/clang/lib/AST/Interp/Disasm.cpp b/clang/lib/AST/Interp/Disasm.cpp
index 01ef1c24744a58..022b394e58e643 100644
--- a/clang/lib/AST/Interp/Disasm.cpp
+++ b/clang/lib/AST/Interp/Disasm.cpp
@@ -233,3 +233,34 @@ LLVM_DUMP_METHOD void InterpFrame::dump(llvm::raw_ostream &OS,
F = F->Caller;
}
}
+
+LLVM_DUMP_METHOD void Record::dump(llvm::raw_ostream &OS, unsigned Indentation,
+ unsigned Offset) const {
+ unsigned Indent = Indentation * 2;
+ OS.indent(Indent);
+ {
+ ColorScope SC(OS, true, {llvm::raw_ostream::BLUE, true});
+ OS << getName() << "\n";
+ }
+
+ unsigned I = 0;
+ for (const Record::Base &B : bases()) {
+ OS.indent(Indent) << "- Base " << I << ". Offset " << (Offset + B.Offset)
+ << "\n";
+ B.R->dump(OS, Indentation + 1, Offset + B.Offset);
+ ++I;
+ }
+
+ // FIXME: Virtual bases.
+
+ I = 0;
+ for (const Record::Field &F : fields()) {
+ OS.indent(Indent) << "- Field " << I << ": ";
+ {
+ ColorScope SC(OS, true, {llvm::raw_ostream::BRIGHT_RED, true});
+ OS << F.Decl->getName();
+ }
+ OS << ". Offset " << (Offset + F.Offset) << "\n";
+ ++I;
+ }
+}
diff --git a/clang/lib/AST/Interp/Record.cpp b/clang/lib/AST/Interp/Record.cpp
index 909416e6e1a1a5..6a0a28bc9124bc 100644
--- a/clang/lib/AST/Interp/Record.cpp
+++ b/clang/lib/AST/Interp/Record.cpp
@@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//
#include "Record.h"
+#include "clang/AST/ASTContext.h"
using namespace clang;
using namespace clang::interp;
@@ -27,6 +28,14 @@ Record::Record(const RecordDecl *Decl, BaseList &&SrcBases,
VirtualBaseMap[V.Decl] = &V;
}
+const std::string Record::getName() const {
+ std::string Ret;
+ llvm::raw_string_ostream OS(Ret);
+ Decl->getNameForDiagnostic(OS, Decl->getASTContext().getPrintingPolicy(),
+ /*Qualified=*/true);
+ return Ret;
+}
+
const Record::Field *Record::getField(const FieldDecl *FD) const {
auto It = FieldMap.find(FD);
assert(It != FieldMap.end() && "Missing field");
diff --git a/clang/lib/AST/Interp/Record.h b/clang/lib/AST/Interp/Record.h
index a6bde01062531b..cf0480b3f62fa6 100644
--- a/clang/lib/AST/Interp/Record.h
+++ b/clang/lib/AST/Interp/Record.h
@@ -51,7 +51,7 @@ class Record final {
/// Returns the underlying declaration.
const RecordDecl *getDecl() const { return Decl; }
/// Returns the name of the underlying declaration.
- const std::string getName() const { return Decl->getNameAsString(); }
+ const std::string getName() const;
/// Checks if the record is a union.
bool isUnion() const { return getDecl()->isUnion(); }
/// Returns the size of the record.
@@ -100,6 +100,10 @@ class Record final {
unsigned getNumVirtualBases() const { return VirtualBases.size(); }
const Base *getVirtualBase(unsigned I) const { return &VirtualBases[I]; }
+ void dump(llvm::raw_ostream &OS, unsigned Indentation = 0,
+ unsigned Offset = 0) const;
+ void dump() const { dump(llvm::errs()); }
+
private:
/// Constructor used by Program to create record descriptors.
Record(const RecordDecl *, BaseList &&Bases, FieldList &&Fields,
More information about the cfe-commits
mailing list