94 lines
2.8 KiB
C++
94 lines
2.8 KiB
C++
//===- subzero/src/IceTranslator.h - ICE to machine code --------*- C++ -*-===//
|
|
//
|
|
// The Subzero Code Generator
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
///
|
|
/// \file
|
|
/// \brief Declares the general driver class for translating ICE to machine
|
|
/// code.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef SUBZERO_SRC_ICETRANSLATOR_H
|
|
#define SUBZERO_SRC_ICETRANSLATOR_H
|
|
|
|
#include "IceDefs.h"
|
|
#include "IceGlobalContext.h"
|
|
|
|
#include <memory>
|
|
|
|
namespace llvm {
|
|
class Module;
|
|
} // end of namespace llvm
|
|
|
|
namespace Ice {
|
|
|
|
class ClFlags;
|
|
class Cfg;
|
|
class VariableDeclaration;
|
|
class GlobalContext;
|
|
|
|
/// Base class for translating ICE to machine code. Derived classes convert
|
|
/// other intermediate representations down to ICE, and then call the
|
|
/// appropriate (inherited) methods to convert ICE into machine instructions.
|
|
class Translator {
|
|
Translator() = delete;
|
|
Translator(const Translator &) = delete;
|
|
Translator &operator=(const Translator &) = delete;
|
|
|
|
public:
|
|
explicit Translator(GlobalContext *Ctx);
|
|
|
|
virtual ~Translator() = default;
|
|
const ErrorCode &getErrorStatus() const { return ErrorStatus; }
|
|
|
|
GlobalContext *getContext() const { return Ctx; }
|
|
|
|
/// Translates the constructed ICE function Func to machine code.
|
|
void translateFcn(std::unique_ptr<Cfg> Func);
|
|
|
|
/// Lowers the given list of global addresses to target. Generates list of
|
|
/// corresponding variable declarations.
|
|
void
|
|
lowerGlobals(std::unique_ptr<VariableDeclarationList> VariableDeclarations);
|
|
|
|
/// Creates a name using the given prefix and corresponding index.
|
|
std::string createUnnamedName(const std::string &Prefix, SizeT Index);
|
|
|
|
/// Reports if there is a (potential) conflict between Name, and using Prefix
|
|
/// to name unnamed names. Errors are put on Ostream. Returns true if there
|
|
/// isn't a potential conflict.
|
|
bool checkIfUnnamedNameSafe(const std::string &Name, const char *Kind,
|
|
const std::string &Prefix);
|
|
|
|
uint32_t getNextSequenceNumber() { return NextSequenceNumber++; }
|
|
|
|
protected:
|
|
GlobalContext *Ctx;
|
|
uint32_t NextSequenceNumber;
|
|
/// ErrorCode of the translation.
|
|
ErrorCode ErrorStatus;
|
|
};
|
|
|
|
class CfgOptWorkItem final : public OptWorkItem {
|
|
CfgOptWorkItem() = delete;
|
|
CfgOptWorkItem(const CfgOptWorkItem &) = delete;
|
|
CfgOptWorkItem &operator=(const CfgOptWorkItem &) = delete;
|
|
|
|
public:
|
|
CfgOptWorkItem(std::unique_ptr<Cfg> Func) : Func(std::move(Func)) {}
|
|
std::unique_ptr<Cfg> getParsedCfg() override { return std::move(Func); }
|
|
~CfgOptWorkItem() override = default;
|
|
|
|
private:
|
|
std::unique_ptr<Ice::Cfg> Func;
|
|
};
|
|
|
|
} // end of namespace Ice
|
|
|
|
#endif // SUBZERO_SRC_ICETRANSLATOR_H
|