xmethods.py 1.5 KB
Newer Older
M
Megvii Engine Team 已提交
1
import re
M
Megvii Engine Team 已提交
2
import sys
M
Megvii Engine Team 已提交
3 4 5 6 7 8 9 10 11 12 13

import gdb
import gdb.types
import gdb.xmethod


class SmallVectorImplWorker_at(gdb.xmethod.XMethodWorker):
    def __init__(self, t):
        self.t = t

    def get_arg_types(self):
M
Megvii Engine Team 已提交
14
        return gdb.lookup_type("int")
M
Megvii Engine Team 已提交
15 16 17 18 19

    def get_result_type(self, *args):
        return self.t

    def __call__(self, obj, i):
M
Megvii Engine Team 已提交
20
        return (obj["m_begin_ptr"].cast(self.t.pointer()) + i).dereference()
M
Megvii Engine Team 已提交
21 22 23 24 25 26 27 28 29 30


class SmallVectorImplWorker_size(gdb.xmethod.XMethodWorker):
    def __init__(self, t):
        self.t = t

    def get_arg_types(self):
        return None

    def get_result_type(self, *args):
M
Megvii Engine Team 已提交
31
        return gdb.lookup_type("int")
M
Megvii Engine Team 已提交
32 33

    def __call__(self, obj):
M
Megvii Engine Team 已提交
34 35 36 37 38
        return obj["m_end_ptr"].cast(self.t.pointer()) - obj["m_begin_ptr"].cast(
            self.t.pointer()
        )


M
Megvii Engine Team 已提交
39 40
class SmallVectorImplMatcher(gdb.xmethod.XMethodMatcher):
    def __init__(self):
M
Megvii Engine Team 已提交
41 42
        super().__init__("SmallVectorImplMatcher")

M
Megvii Engine Team 已提交
43
    def match(self, class_type, method_name):
M
Megvii Engine Team 已提交
44 45
        if re.match("^megdnn::SmallVector(Impl)?<.*>", class_type.tag):
            if method_name == "at":
M
Megvii Engine Team 已提交
46
                return SmallVectorImplWorker_at(class_type.template_argument(0))
M
Megvii Engine Team 已提交
47
            if method_name == "operator[]":
M
Megvii Engine Team 已提交
48
                return SmallVectorImplWorker_at(class_type.template_argument(0))
M
Megvii Engine Team 已提交
49
            if method_name == "size":
M
Megvii Engine Team 已提交
50 51 52
                return SmallVectorImplWorker_size(class_type.template_argument(0))


53 54
if sys.version_info.major > 2:
    gdb.xmethod.register_xmethod_matcher(None, SmallVectorImplMatcher())