(1)结构体type含有结构体指针不支持。
%struct._IO_marker = type { %struct._IO_marker*, %struct._IO_FILE*, i32 }
%struct.item_details = type { [30 x i8], i32, float, float }
%1 = load %struct._IO_FILE*, %struct._IO_FILE** @stdin, align 8, !tbaa !6
%2 = call i32 @_IO_getc(%struct._IO_FILE* %1) #5
(2)结构体内存拼接种类繁多,memcpy(A,B)不支持,部分情况支持。
(3)external结构体变量 不支持
(4)未初始化的globalvariable需要分解,processGlobalVar暂未支持。
1、LoadiNAsFunctionArg()中,将函数参数改完的MidF,内部进行修改时,
(1)先看看iN的user是不是为StoreInst指令,有的话,直接将x,y给它,不用拼接
(2)再看看iN的user是不是CallInst的参数,是的话,调用callInst对应的process函数处理
(3)看还有其他情况否?
2、结论:C++ map中key不要使用指针,请直接使用对象。为什么我一直以指针作为key值,我在oldF和newF匹配时用的map,比较指针值
3、memcpy类型讨论,当参数为内存拼接的iN。
memcpy(A,B) A,B可能为alloca、global、argument
4、函数参数返回值为struct未处理
5、当传递struct 传值和传指针不同时。参数怎样变化。
(Student *s)应该修改了值
(Student s)值不变
6、当前的function_map_根据以下例子可见不支持,只支持函数中存在一个struct例子。
容易出错的地方:
1、利用oldF创建NewF,oldF有其余指令调用,不能删,假设没有,想删除,里面的alloca指令需要从vertex删除。放在所有处理结尾再删除OldF,如果OldF还有指令调用,出错。
2、llvm::PointerType::get(llvm::Type*, unsigned int)
getelementptrInst创建出错,可能因为list的参数不对
3、对IR先进行pretreatment处理,想把所有的ConstantExpr转化为instruction处理,把转化后的ConstantExpr再删除,但是删除ConstantExpr会报错,不知原因,可能会破坏user之间连接关系。所以一旦出问题,可能是ConstantExpr删除的问题,目前只删除user为0的ConstantExpr。
4、processVertexValue()中的val可能是一个ConstantExpr。在某个instruction,没有处理,应该不可能,注意一下。