pin-gcc-client/0008-Pin-gcc-client-Fix-bug-for-BuildCallOp.patch

116 lines
4.8 KiB
Diff
Raw Normal View History

From d8c42ec77001c29291a31484031cb7b5f2b52d48 Mon Sep 17 00:00:00 2001
From: Mingchuan Wu <wumingchuan1992@foxmail.com>
Date: Tue, 21 Feb 2023 16:53:09 +0800
Subject: [PATCH 8/9] [Pin-gcc-client] Fix bug for BuildCallOp. Now we can
convert the function pointer.
diff --git a/include/Dialect/PluginOps.td b/include/Dialect/PluginOps.td
index bac84be..713623c 100644
--- a/include/Dialect/PluginOps.td
+++ b/include/Dialect/PluginOps.td
@@ -85,12 +85,15 @@ def CallOp : Plugin_Op<"call", [
The arguments list must match the arguments expected by the callee.
}];
let arguments = (ins UI64Attr:$id,
- FlatSymbolRefAttr:$callee,
+ OptionalAttr<FlatSymbolRefAttr>:$callee,
Variadic<AnyType>:$inputs);
let results = (outs Optional<AnyType>:$result);
let builders = [
OpBuilderDAG<(ins "uint64_t":$id, "StringRef":$callee,
- "ArrayRef<Value>":$arguments, "Type":$retType)>
+ "ArrayRef<Value>":$arguments, "Type":$retType)>,
+ OpBuilderDAG<(ins "uint64_t":$id,
+ "ArrayRef<Value>":$arguments,
+ "Type":$retType)>
];
let extraClassDeclaration = [{
Type getResultType() { return this->getOperation()->getResult(0).getType(); }
diff --git a/lib/Dialect/PluginOps.cpp b/lib/Dialect/PluginOps.cpp
index da5f3f3..1ea3b5a 100644
--- a/lib/Dialect/PluginOps.cpp
+++ b/lib/Dialect/PluginOps.cpp
@@ -146,6 +146,14 @@ void CallOp::build(OpBuilder &builder, OperationState &state,
if (retType != nullptr) state.addTypes(retType);
}
+void CallOp::build(OpBuilder &builder, OperationState &state,
+ uint64_t id, ArrayRef<Value> arguments, Type retType)
+{
+ state.addAttribute("id", builder.getI64IntegerAttr(id));
+ state.addOperands(arguments);
+ if (retType != nullptr) state.addTypes(retType);
+}
+
/// Return the callee of the generic call operation, this is required by the
/// call interface.
CallInterfaceCallable CallOp::getCallableForCallee()
diff --git a/lib/PluginClient/PluginJson.cpp b/lib/PluginClient/PluginJson.cpp
index ccadf10..966d35e 100755
--- a/lib/PluginClient/PluginJson.cpp
+++ b/lib/PluginClient/PluginJson.cpp
@@ -341,7 +341,10 @@ Json::Value PluginJson::CallOpJsonSerialize(CallOp& data)
{
Json::Value item;
item["id"] = std::to_string(data.idAttr().getInt());
- item["callee"] = data.callee().str();
+ Optional<StringRef> calleeName = data.callee();
+ if (calleeName) {
+ item["callee"] = calleeName->str();
+ }
item["OperationName"] = data.getOperation()->getName().getStringRef().str();
size_t opIdx = 0;
for (mlir::Value v : data.getArgOperands()) {
diff --git a/lib/Translate/GimpleToPluginOps.cpp b/lib/Translate/GimpleToPluginOps.cpp
index c4e5611..515e5e6 100644
--- a/lib/Translate/GimpleToPluginOps.cpp
+++ b/lib/Translate/GimpleToPluginOps.cpp
@@ -645,10 +645,6 @@ uint64_t GimpleToPluginOps::CreateGphiNode(uint64_t argId, uint64_t blockId)
CallOp GimpleToPluginOps::BuildCallOp(uint64_t gcallId)
{
gcall *stmt = reinterpret_cast<gcall*>(gcallId);
- tree fndecl = gimple_call_fndecl(stmt);
- if (fndecl == NULL_TREE || DECL_NAME(fndecl) == NULL_TREE) {
- return nullptr;
- }
llvm::SmallVector<Value, 4> ops;
ops.reserve(gimple_call_num_args(stmt));
for (unsigned i = 0; i < gimple_call_num_args(stmt); i++) {
@@ -658,11 +654,18 @@ CallOp GimpleToPluginOps::BuildCallOp(uint64_t gcallId)
Value arg = TreeToValue(argId);
ops.push_back(arg);
}
- StringRef callName(IDENTIFIER_POINTER(DECL_NAME(fndecl)));
tree returnType = gimple_call_return_type(stmt);
PluginTypeBase rPluginType = typeTranslator.translateType((intptr_t)returnType);
- CallOp ret = builder.create<CallOp>(builder.getUnknownLoc(),
- gcallId, callName, ops, rPluginType);
+ tree fndecl = gimple_call_fndecl(stmt);
+ CallOp ret;
+ if (fndecl == NULL_TREE || DECL_NAME(fndecl) == NULL_TREE) {
+ ret = builder.create<CallOp>(builder.getUnknownLoc(),
+ gcallId, ops, rPluginType);
+ } else {
+ StringRef callName(IDENTIFIER_POINTER(DECL_NAME(fndecl)));
+ ret = builder.create<CallOp>(builder.getUnknownLoc(),
+ gcallId, callName, ops, rPluginType);
+ }
return ret;
}
@@ -860,6 +863,10 @@ Value GimpleToPluginOps::TreeToValue(uint64_t treeId)
} else {
abort();
}
+ opValue = builder.create<ConstOp>(
+ builder.getUnknownLoc(), treeId, IDefineCode::IntCST,
+ readOnly, initAttr, rPluginType);
+ break;
}
case MEM_REF : {
tree operand0 = TREE_OPERAND(t, 0);
--
2.27.0.windows.1