ZLUDA/zluda_bindgen/build/decompile_cublaslt_internal.py

41 lines
2.2 KiB
Python

# Modified from here: https://github.com/galoget/ghidra-headless-scripts/
# Usage: analyzeHeadless <PROJECT_PATH> cublaslt -import /usr/local/cuda/lib64/libcublasLt.so -scriptPath . -postScript decompile_cublaslt_internal.py
from ghidra.app.decompiler import DecompInterface
from ghidra.util.task import ConsoleTaskMonitor
EXTERNAL_HEADER = "/usr/local/cuda/include/cublasLt.h"
with open(EXTERNAL_HEADER, 'r'):
header_content = open(EXTERNAL_HEADER, 'r').read()
decompinterface = DecompInterface()
decompinterface.openProgram(currentProgram)
functions = currentProgram.getFunctionManager().getFunctions(True)
blaslt_functions = []
monitor = ConsoleTaskMonitor()
with open("cublasLt_internal.h", "w") as output_file:
output_file.write("// GENERATED AUTOMATICALLY BY decompile_cublaslt_internal.py. DO NOT EDIT MANUALLY\n")
output_file.write("extern \"C\" {\n")
output_file.write(" #define undefined void")
output_file.write(" #define undefined1 unsigned char")
output_file.write(" #define undefined4 unsigned int")
output_file.write(" #define uint unsigned int")
output_file.write(" #define undefined8 unsigned long long")
output_file.write(" #define ulong unsigned long long")
for function in functions:
function_name = function.getName()
if not function_name.startswith("cublasLt"):
continue
if function_name.format("{}(") in header_content:
continue
decompile_results = decompinterface.decompileFunction(function, 0, monitor)
signature = decompile_results.getDecompiledFunction().getSignature()
# Ghidra disssasembles cublasLtShutdownCtx to return void, but
# looking at the assembly I'm convinced it returns a value
# On the other hand, cublasLtLegacyGemmUtilization* seem to return void
# TODO: fail if there is a new void-return function
if function_name == "cublasLtShutdownCtx":
signature = signature.replace("void", "undefined4")
output_file.write(" CUBLASWINAPI {}\n".format(signature))
output_file.write("}\n")