From 2a91b6ddac99665490df6f06789b2013201c37ec Mon Sep 17 00:00:00 2001 From: mxHuber Date: Tue, 18 Jun 2024 20:40:50 +0200 Subject: [PATCH] Introducing a pass to save ptr types --- .../PhasarLLVM/Passes/OpaquePtrTyPass.h | 37 ++++++++++ lib/PhasarLLVM/Passes/OpaquePtrTyPass.cpp | 68 +++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 include/phasar/PhasarLLVM/Passes/OpaquePtrTyPass.h create mode 100644 lib/PhasarLLVM/Passes/OpaquePtrTyPass.cpp diff --git a/include/phasar/PhasarLLVM/Passes/OpaquePtrTyPass.h b/include/phasar/PhasarLLVM/Passes/OpaquePtrTyPass.h new file mode 100644 index 000000000..baa7cb6bc --- /dev/null +++ b/include/phasar/PhasarLLVM/Passes/OpaquePtrTyPass.h @@ -0,0 +1,37 @@ +/****************************************************************************** + * Copyright (c) 2018 Philipp Schubert. + * All rights reserved. This program and the accompanying materials are made + * available under the terms of LICENSE.txt. + * + * Contributors: + * Philipp Schubert and others + *****************************************************************************/ + +#ifndef PHASAR_PHASARPASS_OPAQUEPTRTYPASS_H_ +#define PHASAR_PHASARPASS_OPAQUEPTRTYPASS_H_ + +#include "llvm/Pass.h" + +namespace llvm { +class Module; +} // namespace llvm + +namespace psr { + +class OpaquePtrTyPass : public llvm::ModulePass { +public: + static inline char ID = 12; // NOLINT FIXME: make const when LLVM supports it + + explicit OpaquePtrTyPass(); + OpaquePtrTyPass(const OpaquePtrTyPass &) = delete; + OpaquePtrTyPass &operator=(const OpaquePtrTyPass &) = delete; + ~OpaquePtrTyPass() override = default; + + [[nodiscard]] llvm::StringRef getPassName() const override; + + bool runOnModule(llvm::Module &M) override; +}; + +} // namespace psr + +#endif diff --git a/lib/PhasarLLVM/Passes/OpaquePtrTyPass.cpp b/lib/PhasarLLVM/Passes/OpaquePtrTyPass.cpp new file mode 100644 index 000000000..8ff16763f --- /dev/null +++ b/lib/PhasarLLVM/Passes/OpaquePtrTyPass.cpp @@ -0,0 +1,68 @@ +/****************************************************************************** + * Copyright (c) 2024 Philipp Schubert. + * All rights reserved. This program and the accompanying materials are made + * available under the terms of LICENSE.txt. + * + * Contributors: + * Maximilian Leo Huber and others + *****************************************************************************/ + +#include "phasar/PhasarLLVM/Passes/OpaquePtrTyPass.h" + +#include "phasar/Utils/Logger.h" +#include "phasar/Utils/NlohmannLogging.h" + +#include "llvm/ADT/StringRef.h" +#include "llvm/IR/Module.h" +#include "llvm/Support/FileSystem.h" + +#include + +namespace psr { + +OpaquePtrTyPass::OpaquePtrTyPass() : llvm::ModulePass(ID) {} + +llvm::StringRef OpaquePtrTyPass::getPassName() const { + return "OpaquePtrTyPass"; +} + +bool OpaquePtrTyPass::runOnModule(llvm::Module &M) { + llvm::outs() << "OpaquePtrTyPass::runOnModule()\n"; + + std::map PtrTypes; + + // get pointer types + for (const auto &Func : M.getFunctionList()) { + if (Func.isDeclaration()) { + continue; + } + + PtrTypes[Func.getName().str()] = + Func.getFunctionType()->getStructName().str(); + } + + // save pointer types to json file + nlohmann::json Json(PtrTypes); + std::string PathToJson = "./OpaquePtrTyPassJsons/"; + std::string FileName = PathToJson + "PointerTypes.json"; + + llvm::sys::fs::create_directories(PathToJson); + std::error_code EC; + llvm::raw_fd_ostream FileStream(llvm::StringRef(FileName), EC); + + if (EC) { + PHASAR_LOG_LEVEL(ERROR, EC.message()); + return false; + } + + FileStream << Json; + + llvm::outs() << "Json with pointer types saved to: " << PathToJson << "\n"; + + return true; +} +static llvm::RegisterPass + Phasar("opaque-pointer-type-pass", "PhASAR Opaque Pointer Type Pass", false, + false); + +} // namespace psr