[Mlir-commits] [mlir] bc9a375 - Revert "[mlir][Target][LLVM] Adds an utility class for serializing operations to binary strings."

Fabian Mora llvmlistbot at llvm.org
Tue Aug 8 06:28:33 PDT 2023


Author: Fabian Mora
Date: 2023-08-08T13:28:16Z
New Revision: bc9a3751e8038084a547ed29246094a14c0635b4

URL: https://github.com/llvm/llvm-project/commit/bc9a3751e8038084a547ed29246094a14c0635b4
DIFF: https://github.com/llvm/llvm-project/commit/bc9a3751e8038084a547ed29246094a14c0635b4.diff

LOG: Revert "[mlir][Target][LLVM] Adds an utility class for serializing operations to binary strings."

This reverts commit c8e0364a4336569f91fe74dbc231beefc8793518.

Added: 
    

Modified: 
    mlir/lib/Target/CMakeLists.txt
    mlir/unittests/CMakeLists.txt

Removed: 
    mlir/include/mlir/Target/LLVM/ModuleToObject.h
    mlir/lib/Target/LLVM/CMakeLists.txt
    mlir/lib/Target/LLVM/ModuleToObject.cpp
    mlir/unittests/Target/CMakeLists.txt
    mlir/unittests/Target/LLVM/CMakeLists.txt
    mlir/unittests/Target/LLVM/SerializeToLLVMBitcode.cpp


################################################################################
diff  --git a/mlir/include/mlir/Target/LLVM/ModuleToObject.h b/mlir/include/mlir/Target/LLVM/ModuleToObject.h
deleted file mode 100644
index d17afc1077fb45..00000000000000
--- a/mlir/include/mlir/Target/LLVM/ModuleToObject.h
+++ /dev/null
@@ -1,122 +0,0 @@
-//===- ModuleToObject.h - Module to object base class -----------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file declares the base class for transforming operations into binary
-// objects.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef MLIR_TARGET_LLVM_MODULETOOBJECT_H
-#define MLIR_TARGET_LLVM_MODULETOOBJECT_H
-
-#include "mlir/IR/Operation.h"
-#include "llvm/IR/Module.h"
-
-namespace llvm {
-class TargetMachine;
-} // namespace llvm
-
-namespace mlir {
-namespace LLVM {
-class ModuleTranslation;
-/// Utility base class for transforming operations into binary objects, by
-/// default it returns the serialized LLVM bitcode for the module. The
-/// operations being transformed must be translatable into LLVM IR.
-class ModuleToObject {
-public:
-  ModuleToObject(Operation &module, StringRef triple, StringRef chip,
-                 StringRef features = {}, int optLevel = 3);
-  virtual ~ModuleToObject() = default;
-
-  /// Returns the operation being serialized.
-  Operation &getOperation();
-
-  /// Runs the serialization pipeline, returning `std::nullopt` on error.
-  virtual std::optional<SmallVector<char, 0>> run();
-
-protected:
-  // Hooks to be implemented by derived classes.
-
-  /// Hook for loading bitcode files, returns std::nullopt on failure.
-  virtual std::optional<SmallVector<std::unique_ptr<llvm::Module>>>
-  loadBitcodeFiles(llvm::Module &module, llvm::TargetMachine &targetMachine) {
-    return SmallVector<std::unique_ptr<llvm::Module>>();
-  }
-
-  /// Hook for performing additional actions on a loaded bitcode file.
-  virtual LogicalResult handleBitcodeFile(llvm::Module &module,
-                                          llvm::TargetMachine &targetMachine) {
-    return success();
-  }
-
-  /// Hook for performing additional actions on the llvmModule pre linking.
-  virtual void handleModulePreLink(llvm::Module &module,
-                                   llvm::TargetMachine &targetMachine) {}
-
-  /// Hook for performing additional actions on the llvmModule post linking.
-  virtual void handleModulePostLink(llvm::Module &module,
-                                    llvm::TargetMachine &targetMachine) {}
-
-  /// Serializes the LLVM IR bitcode to an object file, by default it serializes
-  /// to LLVM bitcode.
-  virtual std::optional<SmallVector<char, 0>>
-  moduleToObject(llvm::Module &llvmModule, llvm::TargetMachine &targetMachine);
-
-protected:
-  /// Create the target machine based on the target triple and chip.
-  std::unique_ptr<llvm::TargetMachine> createTargetMachine();
-
-  /// Loads a bitcode file from path.
-  std::unique_ptr<llvm::Module>
-  loadBitcodeFile(llvm::LLVMContext &context,
-                  llvm::TargetMachine &targetMachine, StringRef path);
-
-  /// Loads multiple bitcode files.
-  LogicalResult loadBitcodeFilesFromList(
-      llvm::LLVMContext &context, llvm::TargetMachine &targetMachine,
-      ArrayRef<std::string> fileList,
-      SmallVector<std::unique_ptr<llvm::Module>> &llvmModules,
-      bool failureOnError = true);
-
-  /// Translates the operation to LLVM IR.
-  std::unique_ptr<llvm::Module>
-  translateToLLVMIR(llvm::LLVMContext &llvmContext);
-
-  /// Link the llvmModule to other bitcode file.
-  LogicalResult linkFiles(llvm::Module &module,
-                          SmallVector<std::unique_ptr<llvm::Module>> &&libs);
-
-  /// Optimize the module.
-  LogicalResult optimizeModule(llvm::Module &module,
-                               llvm::TargetMachine &targetMachine, int optL);
-
-  /// Utility function for translating to ISA, returns `std::nullopt` on
-  /// failure.
-  static std::optional<std::string>
-  translateToISA(llvm::Module &llvmModule, llvm::TargetMachine &targetMachine);
-
-protected:
-  /// Module to transform to a binary object.
-  Operation &module;
-
-  /// Target triple.
-  StringRef triple;
-
-  /// Target chip.
-  StringRef chip;
-
-  /// Target features.
-  StringRef features;
-
-  /// Optimization level.
-  int optLevel;
-};
-} // namespace LLVM
-} // namespace mlir
-
-#endif // MLIR_TARGET_LLVM_MODULETOOBJECT_H

diff  --git a/mlir/lib/Target/CMakeLists.txt b/mlir/lib/Target/CMakeLists.txt
index c3ec1b4f1e3fed..acc3985cc80e66 100644
--- a/mlir/lib/Target/CMakeLists.txt
+++ b/mlir/lib/Target/CMakeLists.txt
@@ -1,4 +1,3 @@
 add_subdirectory(Cpp)
 add_subdirectory(SPIRV)
 add_subdirectory(LLVMIR)
-add_subdirectory(LLVM)

diff  --git a/mlir/lib/Target/LLVM/CMakeLists.txt b/mlir/lib/Target/LLVM/CMakeLists.txt
deleted file mode 100644
index 6fc5310e04fa0e..00000000000000
--- a/mlir/lib/Target/LLVM/CMakeLists.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-add_mlir_library(MLIRTargetLLVM
-  ModuleToObject.cpp
-
-  ADDITIONAL_HEADER_DIRS
-  ${MLIR_MAIN_INCLUDE_DIR}/mlir/Target/LLVM
-
-  DEPENDS
-  intrinsics_gen
-
-  LINK_COMPONENTS
-  Core
-  IPO
-  Passes
-  Support
-  Target
-  TargetParser
-  LINK_LIBS PUBLIC
-  MLIRExecutionEngineUtils
-  MLIRTargetLLVMIRExport
-)

diff  --git a/mlir/lib/Target/LLVM/ModuleToObject.cpp b/mlir/lib/Target/LLVM/ModuleToObject.cpp
deleted file mode 100644
index 1ce72e6bb16230..00000000000000
--- a/mlir/lib/Target/LLVM/ModuleToObject.cpp
+++ /dev/null
@@ -1,228 +0,0 @@
-//===- ModuleToObject.cpp - Module to object base class ---------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file implements the base class for transforming Operations into binary
-// objects.
-//
-//===----------------------------------------------------------------------===//
-
-#include "mlir/Target/LLVM/ModuleToObject.h"
-
-#include "mlir/ExecutionEngine/OptUtils.h"
-#include "mlir/IR/BuiltinOps.h"
-#include "mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h"
-#include "mlir/Target/LLVMIR/Export.h"
-#include "mlir/Target/LLVMIR/ModuleTranslation.h"
-
-#include "llvm/Bitcode/BitcodeWriter.h"
-#include "llvm/IR/LegacyPassManager.h"
-#include "llvm/IRReader/IRReader.h"
-#include "llvm/Linker/Linker.h"
-#include "llvm/MC/TargetRegistry.h"
-#include "llvm/Support/FileSystem.h"
-#include "llvm/Support/Path.h"
-#include "llvm/Support/SourceMgr.h"
-#include "llvm/Support/raw_ostream.h"
-#include "llvm/Target/TargetMachine.h"
-#include "llvm/TargetParser/TargetParser.h"
-#include "llvm/Transforms/IPO/Internalize.h"
-
-using namespace mlir;
-using namespace mlir::LLVM;
-
-ModuleToObject::ModuleToObject(Operation &module, StringRef triple,
-                               StringRef chip, StringRef features, int optLevel)
-    : module(module), triple(triple), chip(chip), features(features),
-      optLevel(optLevel) {}
-
-Operation &ModuleToObject::getOperation() { return module; }
-
-std::unique_ptr<llvm::TargetMachine> ModuleToObject::createTargetMachine() {
-  std::string error;
-  // Load the target.
-  const llvm::Target *target =
-      llvm::TargetRegistry::lookupTarget(triple, error);
-  if (!target) {
-    getOperation().emitError() << "Failed to lookup target: " << error;
-    return {};
-  }
-
-  // Create the target machine using the target.
-  llvm::TargetMachine *machine =
-      target->createTargetMachine(triple, chip, features, {}, {});
-  if (!machine) {
-    getOperation().emitError() << "Failed to create the target machine.";
-    return {};
-  }
-  return std::unique_ptr<llvm::TargetMachine>{machine};
-}
-
-std::unique_ptr<llvm::Module>
-ModuleToObject::loadBitcodeFile(llvm::LLVMContext &context,
-                                llvm::TargetMachine &targetMachine,
-                                StringRef path) {
-  llvm::SMDiagnostic error;
-  std::unique_ptr<llvm::Module> library =
-      llvm::getLazyIRFileModule(path, error, context);
-  if (!library) {
-    getOperation().emitError() << "Failed loading file from " << path
-                               << ", error: " << error.getMessage();
-    return nullptr;
-  }
-  if (failed(handleBitcodeFile(*library, targetMachine))) {
-    return nullptr;
-  }
-  return library;
-}
-
-LogicalResult ModuleToObject::loadBitcodeFilesFromList(
-    llvm::LLVMContext &context, llvm::TargetMachine &targetMachine,
-    ArrayRef<std::string> fileList,
-    SmallVector<std::unique_ptr<llvm::Module>> &llvmModules,
-    bool failureOnError) {
-  for (const std::string &str : fileList) {
-    // Test if the path exists, if it doesn't abort.
-    StringRef pathRef = StringRef(str.data(), str.size());
-    if (!llvm::sys::fs::is_regular_file(pathRef)) {
-      getOperation().emitError()
-          << "File path: " << pathRef << " does not exist or is not a file.\n";
-      return failure();
-    }
-    // Load the file or abort on error.
-    if (auto bcFile = loadBitcodeFile(context, targetMachine, pathRef))
-      llvmModules.push_back(std::move(bcFile));
-    else if (failureOnError)
-      return failure();
-  }
-  return success();
-}
-
-std::unique_ptr<llvm::Module>
-ModuleToObject::translateToLLVMIR(llvm::LLVMContext &llvmContext) {
-  return translateModuleToLLVMIR(&getOperation(), llvmContext);
-}
-
-LogicalResult
-ModuleToObject::linkFiles(llvm::Module &module,
-                          SmallVector<std::unique_ptr<llvm::Module>> &&libs) {
-  if (libs.empty())
-    return success();
-  llvm::Linker linker(module);
-  for (std::unique_ptr<llvm::Module> &libModule : libs) {
-    // This bitcode linking imports the library functions into the module,
-    // allowing LLVM optimization passes (which must run after linking) to
-    // optimize across the libraries and the module's code. We also only import
-    // symbols if they are referenced by the module or a previous library since
-    // there will be no other source of references to those symbols in this
-    // compilation and since we don't want to bloat the resulting code object.
-    bool err = linker.linkInModule(
-        std::move(libModule), llvm::Linker::Flags::LinkOnlyNeeded,
-        [](llvm::Module &m, const StringSet<> &gvs) {
-          llvm::internalizeModule(m, [&gvs](const llvm::GlobalValue &gv) {
-            return !gv.hasName() || (gvs.count(gv.getName()) == 0);
-          });
-        });
-    // True is linker failure
-    if (err) {
-      getOperation().emitError("Unrecoverable failure during bitcode linking.");
-      // We have no guaranties about the state of `ret`, so bail
-      return failure();
-    }
-  }
-  return success();
-}
-
-LogicalResult ModuleToObject::optimizeModule(llvm::Module &module,
-                                             llvm::TargetMachine &targetMachine,
-                                             int optLevel) {
-  if (optLevel < 0 || optLevel > 3)
-    return getOperation().emitError()
-           << "Invalid optimization level: " << optLevel << ".";
-
-  targetMachine.setOptLevel(static_cast<llvm::CodeGenOpt::Level>(optLevel));
-
-  auto transformer =
-      makeOptimizingTransformer(optLevel, /*sizeLevel=*/0, &targetMachine);
-  auto error = transformer(&module);
-  if (error) {
-    InFlightDiagnostic mlirError = getOperation().emitError();
-    llvm::handleAllErrors(
-        std::move(error), [&mlirError](const llvm::ErrorInfoBase &ei) {
-          mlirError << "Could not optimize LLVM IR: " << ei.message() << "\n";
-        });
-    return mlirError;
-  }
-  return success();
-}
-
-std::optional<std::string>
-ModuleToObject::translateToISA(llvm::Module &llvmModule,
-                               llvm::TargetMachine &targetMachine) {
-  std::string targetISA;
-  llvm::raw_string_ostream stream(targetISA);
-
-  { // Drop pstream after this to prevent the ISA from being stuck buffering
-    llvm::buffer_ostream pstream(stream);
-    llvm::legacy::PassManager codegenPasses;
-
-    if (targetMachine.addPassesToEmitFile(codegenPasses, pstream, nullptr,
-                                          llvm::CGFT_AssemblyFile))
-      return std::nullopt;
-
-    codegenPasses.run(llvmModule);
-  }
-  return stream.str();
-}
-
-std::optional<SmallVector<char, 0>>
-ModuleToObject::moduleToObject(llvm::Module &llvmModule,
-                               llvm::TargetMachine &targetMachine) {
-  SmallVector<char, 0> binaryData;
-  // Write the LLVM module bitcode to a buffer.
-  llvm::raw_svector_ostream outputStream(binaryData);
-  llvm::WriteBitcodeToFile(llvmModule, outputStream);
-  return binaryData;
-}
-
-std::optional<SmallVector<char, 0>> ModuleToObject::run() {
-  // Translate the module to LLVM IR.
-  llvm::LLVMContext llvmContext;
-  std::unique_ptr<llvm::Module> llvmModule = translateToLLVMIR(llvmContext);
-  if (!llvmModule) {
-    getOperation().emitError() << "Failed creating the llvm::Module.";
-    return std::nullopt;
-  }
-
-  // Create the target machine.
-  std::unique_ptr<llvm::TargetMachine> targetMachine = createTargetMachine();
-  if (!targetMachine)
-    return std::nullopt;
-
-  // Set the data layout and target triple of the module.
-  llvmModule->setDataLayout(targetMachine->createDataLayout());
-  llvmModule->setTargetTriple(targetMachine->getTargetTriple().getTriple());
-
-  // Link bitcode files.
-  handleModulePreLink(*llvmModule, *targetMachine);
-  {
-    auto libs = loadBitcodeFiles(*llvmModule, *targetMachine);
-    if (!libs)
-      return std::nullopt;
-    if (libs->size())
-      if (failed(linkFiles(*llvmModule, std::move(*libs))))
-        return std::nullopt;
-    handleModulePostLink(*llvmModule, *targetMachine);
-  }
-
-  // Optimize the module.
-  if (failed(optimizeModule(*llvmModule, *targetMachine, optLevel)))
-    return std::nullopt;
-
-  // Return the serialized object.
-  return moduleToObject(*llvmModule, *targetMachine);
-}

diff  --git a/mlir/unittests/CMakeLists.txt b/mlir/unittests/CMakeLists.txt
index d0e222091c9f89..5ca3826e529c07 100644
--- a/mlir/unittests/CMakeLists.txt
+++ b/mlir/unittests/CMakeLists.txt
@@ -16,7 +16,6 @@ add_subdirectory(Pass)
 add_subdirectory(Support)
 add_subdirectory(Rewrite)
 add_subdirectory(TableGen)
-add_subdirectory(Target)
 add_subdirectory(Transforms)
 
 if(MLIR_ENABLE_EXECUTION_ENGINE)

diff  --git a/mlir/unittests/Target/CMakeLists.txt b/mlir/unittests/Target/CMakeLists.txt
deleted file mode 100644
index 8bd3107356c056..00000000000000
--- a/mlir/unittests/Target/CMakeLists.txt
+++ /dev/null
@@ -1 +0,0 @@
-add_subdirectory(LLVM)

diff  --git a/mlir/unittests/Target/LLVM/CMakeLists.txt b/mlir/unittests/Target/LLVM/CMakeLists.txt
deleted file mode 100644
index cae5b6ca221970..00000000000000
--- a/mlir/unittests/Target/LLVM/CMakeLists.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-add_mlir_unittest(MLIRTargetLLVMTests
-  SerializeToLLVMBitcode.cpp
-)
-
-llvm_map_components_to_libnames(llvm_libs nativecodegen)
-
-target_link_libraries(MLIRTargetLLVMTests
-  PRIVATE
-  MLIRTargetLLVM
-  MLIRLLVMDialect
-  MLIRLLVMToLLVMIRTranslation
-  MLIRBuiltinToLLVMIRTranslation
-  ${llvm_libs}
-)
-
-if (DEFINED LLVM_NATIVE_TARGET)
-  target_compile_definitions(MLIRTargetLLVMTests
-    PRIVATE
-    -DLLVM_NATIVE_TARGET_TEST_ENABLED=1
-  )
-else()
-  target_compile_definitions(MLIRTargetLLVMTests
-    PRIVATE
-    -DLLVM_NATIVE_TARGET_TEST_ENABLED=0
-  )
-endif()

diff  --git a/mlir/unittests/Target/LLVM/SerializeToLLVMBitcode.cpp b/mlir/unittests/Target/LLVM/SerializeToLLVMBitcode.cpp
deleted file mode 100644
index c23ed7efd72fdf..00000000000000
--- a/mlir/unittests/Target/LLVM/SerializeToLLVMBitcode.cpp
+++ /dev/null
@@ -1,76 +0,0 @@
-//===- SerializeToLLVMBitcode.cpp -------------------------------*- C++ -*-===//
-//
-// This file is licensed under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "mlir/IR/BuiltinOps.h"
-#include "mlir/IR/MLIRContext.h"
-#include "mlir/Parser/Parser.h"
-#include "mlir/Target/LLVM/ModuleToObject.h"
-#include "mlir/Target/LLVMIR/Dialect/Builtin/BuiltinToLLVMIRTranslation.h"
-#include "mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h"
-
-#include "llvm/IRReader/IRReader.h"
-#include "llvm/Support/MemoryBufferRef.h"
-#include "llvm/Support/TargetSelect.h"
-#include "llvm/Support/raw_ostream.h"
-#include "llvm/TargetParser/Host.h"
-
-#include "gmock/gmock.h"
-
-using namespace mlir;
-
-// Skip the test if the native target was not built.
-#if LLVM_NATIVE_TARGET_TEST_ENABLED == 0
-#define SKIP_WITHOUT_NATIVE(x) DISABLED_##x
-#else
-#define SKIP_WITHOUT_NATIVE(x) x
-#endif
-
-class MLIRTargetLLVM : public ::testing::Test {
-protected:
-  virtual void SetUp() {
-    llvm::InitializeNativeTarget();
-    llvm::InitializeNativeTargetAsmPrinter();
-  }
-};
-
-TEST_F(MLIRTargetLLVM, SKIP_WITHOUT_NATIVE(SerializeToLLVMBitcode)) {
-  std::string moduleStr = R"mlir(
-  llvm.func @foo(%arg0 : i32) {
-    llvm.return
-  }
-  )mlir";
-
-  DialectRegistry registry;
-  registerBuiltinDialectTranslation(registry);
-  registerLLVMDialectTranslation(registry);
-  MLIRContext context(registry);
-
-  OwningOpRef<ModuleOp> module =
-      parseSourceString<ModuleOp>(moduleStr, &context);
-  ASSERT_TRUE(!!module);
-
-  // Serialize the module.
-  std::string targetTriple = llvm::sys::getDefaultTargetTriple();
-  LLVM::ModuleToObject serializer(*(module->getOperation()), targetTriple, "",
-                                  "");
-  std::optional<SmallVector<char, 0>> serializedModule = serializer.run();
-  ASSERT_TRUE(!!serializedModule);
-  ASSERT_TRUE(serializedModule->size() > 0);
-
-  // Read the serialized module.
-  llvm::MemoryBufferRef buffer(
-      StringRef(serializedModule->data(), serializedModule->size()), "module");
-  llvm::LLVMContext llvmContext;
-  llvm::Expected<std::unique_ptr<llvm::Module>> llvmModule =
-      llvm::getLazyBitcodeModule(buffer, llvmContext);
-  ASSERT_TRUE(!!llvmModule);
-  ASSERT_TRUE(!!*llvmModule);
-
-  // Check that it has a function named `foo`.
-  ASSERT_TRUE((*llvmModule)->getFunction("foo") != nullptr);
-}


        


More information about the Mlir-commits mailing list