mirror of
https://github.com/JakeHillion/object-introspection.git
synced 2024-11-10 05:26:56 +00:00
type_graph: Add reference type
Our existing drgn parser emits pointers, regardless of whether the type in the DWARF is really a reference. Newer parsers like the LLDB/Clang parsers can differentiate between a pointer and a reference. We should do this as references can be safely followed according to the language rules with `ChaseRawPointers` disabled, while pointers cannot. Test Plan: - TBD
This commit is contained in:
parent
8193d271a8
commit
6f5091c953
@ -194,6 +194,14 @@ void NameGen::visit(Pointer& p) {
|
|||||||
p.setInputName(inputName);
|
p.setInputName(inputName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NameGen::visit(Reference& p) {
|
||||||
|
RecursiveVisitor::visit(p);
|
||||||
|
p.regenerateName();
|
||||||
|
std::string inputName{p.pointeeType().inputName()};
|
||||||
|
inputName += '*';
|
||||||
|
p.setInputName(inputName);
|
||||||
|
}
|
||||||
|
|
||||||
void NameGen::visit(DummyAllocator& d) {
|
void NameGen::visit(DummyAllocator& d) {
|
||||||
RecursiveVisitor::visit(d);
|
RecursiveVisitor::visit(d);
|
||||||
d.regenerateName();
|
d.regenerateName();
|
||||||
|
@ -46,6 +46,7 @@ class NameGen final : public RecursiveVisitor {
|
|||||||
void visit(Array& a) override;
|
void visit(Array& a) override;
|
||||||
void visit(Typedef& td) override;
|
void visit(Typedef& td) override;
|
||||||
void visit(Pointer& p) override;
|
void visit(Pointer& p) override;
|
||||||
|
void visit(Reference& p) override;
|
||||||
void visit(DummyAllocator& d) override;
|
void visit(DummyAllocator& d) override;
|
||||||
void visit(CaptureKeys& d) override;
|
void visit(CaptureKeys& d) override;
|
||||||
|
|
||||||
|
@ -147,6 +147,17 @@ void Printer::visit(const Pointer& p) {
|
|||||||
print(p.pointeeType());
|
print(p.pointeeType());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Printer::visit(const Reference& p) {
|
||||||
|
if (prefix(p))
|
||||||
|
return;
|
||||||
|
|
||||||
|
out_ << "Reference";
|
||||||
|
if (auto inp = p.inputName(); !inp.empty())
|
||||||
|
out_ << " [" << inp << "]";
|
||||||
|
out_ << std::endl;
|
||||||
|
print(p.pointeeType());
|
||||||
|
}
|
||||||
|
|
||||||
void Printer::visit(const Dummy& d) {
|
void Printer::visit(const Dummy& d) {
|
||||||
if (prefix(d))
|
if (prefix(d))
|
||||||
return;
|
return;
|
||||||
|
@ -40,6 +40,7 @@ class Printer : public ConstVisitor {
|
|||||||
void visit(const Array& a) override;
|
void visit(const Array& a) override;
|
||||||
void visit(const Typedef& td) override;
|
void visit(const Typedef& td) override;
|
||||||
void visit(const Pointer& p) override;
|
void visit(const Pointer& p) override;
|
||||||
|
void visit(const Reference& p) override;
|
||||||
void visit(const Dummy& d) override;
|
void visit(const Dummy& d) override;
|
||||||
void visit(const DummyAllocator& d) override;
|
void visit(const DummyAllocator& d) override;
|
||||||
void visit(const CaptureKeys& d) override;
|
void visit(const CaptureKeys& d) override;
|
||||||
|
@ -42,4 +42,8 @@ void RemoveTopLevelPointer::visit(Pointer& p) {
|
|||||||
topLevelType_ = &p.pointeeType();
|
topLevelType_ = &p.pointeeType();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RemoveTopLevelPointer::visit(Reference& p) {
|
||||||
|
topLevelType_ = &p.pointeeType();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace oi::detail::type_graph
|
} // namespace oi::detail::type_graph
|
||||||
|
@ -36,6 +36,7 @@ class RemoveTopLevelPointer : public LazyVisitor {
|
|||||||
|
|
||||||
void removeTopLevelPointers(std::vector<std::reference_wrapper<Type>>& types);
|
void removeTopLevelPointers(std::vector<std::reference_wrapper<Type>>& types);
|
||||||
void visit(Pointer& p) override;
|
void visit(Pointer& p) override;
|
||||||
|
void visit(Reference& p) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Type* topLevelType_ = nullptr;
|
Type* topLevelType_ = nullptr;
|
||||||
|
@ -49,6 +49,7 @@
|
|||||||
X(Array) \
|
X(Array) \
|
||||||
X(Typedef) \
|
X(Typedef) \
|
||||||
X(Pointer) \
|
X(Pointer) \
|
||||||
|
X(Reference) \
|
||||||
X(Dummy) \
|
X(Dummy) \
|
||||||
X(DummyAllocator) \
|
X(DummyAllocator) \
|
||||||
X(CaptureKeys)
|
X(CaptureKeys)
|
||||||
@ -715,6 +716,61 @@ class Pointer : public Type {
|
|||||||
std::string name_;
|
std::string name_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class Reference : public Type {
|
||||||
|
public:
|
||||||
|
explicit Reference(NodeId id, Type& pointeeType)
|
||||||
|
: pointeeType_(pointeeType), id_(id) {
|
||||||
|
regenerateName();
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline constexpr bool has_node_id = true;
|
||||||
|
|
||||||
|
DECLARE_ACCEPT
|
||||||
|
|
||||||
|
virtual const std::string& name() const override {
|
||||||
|
return name_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void regenerateName() {
|
||||||
|
name_ = pointeeType_.get().name() + "&";
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual std::string_view inputName() const override {
|
||||||
|
return inputName_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setInputName(std::string name) {
|
||||||
|
inputName_ = std::move(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual size_t size() const override {
|
||||||
|
return sizeof(uintptr_t);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual uint64_t align() const override {
|
||||||
|
return size();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual NodeId id() const override {
|
||||||
|
return id_;
|
||||||
|
}
|
||||||
|
|
||||||
|
Type& pointeeType() const {
|
||||||
|
return pointeeType_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setPointeeType(Type& type) {
|
||||||
|
pointeeType_ = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::reference_wrapper<Type> pointeeType_;
|
||||||
|
std::string inputName_;
|
||||||
|
NodeId id_ = -1;
|
||||||
|
|
||||||
|
std::string name_;
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Dummy
|
* Dummy
|
||||||
*
|
*
|
||||||
|
@ -121,6 +121,9 @@ class RecursiveVisitor : public Visitor {
|
|||||||
virtual void visit(Pointer& p) {
|
virtual void visit(Pointer& p) {
|
||||||
accept(p.pointeeType());
|
accept(p.pointeeType());
|
||||||
}
|
}
|
||||||
|
virtual void visit(Reference& r) {
|
||||||
|
accept(r.pointeeType());
|
||||||
|
}
|
||||||
virtual void visit(Dummy&) {
|
virtual void visit(Dummy&) {
|
||||||
}
|
}
|
||||||
virtual void visit(DummyAllocator& d) {
|
virtual void visit(DummyAllocator& d) {
|
||||||
@ -182,6 +185,10 @@ class RecursiveMutator : public Mutator {
|
|||||||
p.setPointeeType(mutate(p.pointeeType()));
|
p.setPointeeType(mutate(p.pointeeType()));
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
virtual Type& visit(Reference& p) {
|
||||||
|
p.setPointeeType(mutate(p.pointeeType()));
|
||||||
|
return p;
|
||||||
|
}
|
||||||
virtual Type& visit(Dummy& d) {
|
virtual Type& visit(Dummy& d) {
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user