-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathinvokestorage.cpp
134 lines (98 loc) · 3.05 KB
/
invokestorage.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include "fix_clang_undef_eai.h"
#include <QDebug>
#include <QVariant>
#include <QThreadStorage>
#include <llvm/IR/Value.h>
#include <clang/AST/Expr.h>
#include "callargument.h"
#include "invokestorage.h"
int EvalType::id = qMetaTypeId<EvalType>();
EvalType::EvalType(clang::Expr *e, llvm::Value *v)
: ve(e), vv(v)
{
}
void is_test1()
{
EvalType v(0, 0);
QVariant a = QVariant::fromValue(v);
qDebug()<<a;
EvalType v2 = a.value<EvalType>();
qMetaTypeId<EvalType>();
int i = 5;
int id = qMetaTypeId<EvalType>();
switch (i) {
case 1:break;
// case EvalType::id: //
break;
};
}
/*
InvokeStorage用于把C++空间的变量作为参数映射到IR/JIT运行空间中。
由于参数有不同的类型,所以每次调用都需要一个参数的存储空间。
并且每次的存储空间也不相同。
在第二版本的实现中,简单的使用了一个不同数据类型的稀疏矩阵方式,
每次调用,在不同的矩阵点上放上不同的值,实现参数传递功能。
这种方式,占用内存比较多。
一种新的设计,满足以下特性:
*) 使用更少的内存。
*) 支持多线程使用。
*) 减小复制,效率更高。
InvokeStorage对象生存周期分析:
由于它只在调用到IR/JIT运行空间有用,从绑定开始,一直到IR/JIT执行结束。
如果在此存储结果的话,一直要到结果取出为止。
实现,使用QThreadStorage实现线程相关的存储,使用QMetaType方式做数据的拷贝。
参数类型分为scala类型与指针类型。
*/
class InvokeStorage3
{
public:
// 参数序号
enum {
ARG1 = 1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7, ARG8, ARG9,
RET = 126, // 存放返回值
SRET = 127, // 存放sret结果
};
InvokeStorage3()
{
}
~InvokeStorage3()
{
}
// get到封装类型
const MetaTypeVariant *getFull(int which)
{
if ((which >= ARG1 && which <= ARG9) || which == RET || which == SRET) {
MetaTypeVariant *pmtv = mcaches.localData().object(which);
return pmtv;
}
return NULL;
}
// get到的是实际的数据地址
void *get(int which)
{
if ((which >= ARG1 && which <= ARG9) || which == RET || which == SRET) {
MetaTypeVariant *pmtv = mcaches.localData().object(which);
return pmtv->get();
}
return NULL;
}
bool set(int which, const MetaTypeVariant &mtv)
{
if ((which >= ARG1 && which <= ARG9) || which == RET || which == SRET) {
MetaTypeVariant *pmtv = new MetaTypeVariant(mtv);
mcaches.localData().insert(which, pmtv);
return true;
}
return false;
}
bool remove(int which)
{
if ((which >= ARG1 && which <= ARG9) || which == RET || which == SRET) {
mcaches.localData().remove(which);
return true;
}
return false;
}
public:
QThreadStorage<QCache<uchar, MetaTypeVariant> > mcaches;
};