| //===- subzero/src/IceTranslator.cpp - 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 Defines the general driver class for translating ICE to machine code. | |
| /// | |
| //===----------------------------------------------------------------------===// | |
| #include "IceTranslator.h" | |
| #include "IceCfg.h" | |
| #include "IceClFlags.h" | |
| #include "IceDefs.h" | |
| #include "IceGlobalInits.h" | |
| #include "IceTargetLowering.h" | |
| #include <utility> | |
| namespace Ice { | |
| Translator::Translator(GlobalContext *Ctx) | |
| : Ctx(Ctx), NextSequenceNumber(GlobalContext::getFirstSequenceNumber()), | |
| ErrorStatus() {} | |
| std::string Translator::createUnnamedName(const std::string &Prefix, | |
| SizeT Index) { | |
| if (Index == 0) | |
| return Prefix; | |
| std::string Buffer; | |
| llvm::raw_string_ostream StrBuf(Buffer); | |
| StrBuf << Prefix << Index; | |
| return StrBuf.str(); | |
| } | |
| bool Translator::checkIfUnnamedNameSafe(const std::string &Name, | |
| const char *Kind, | |
| const std::string &Prefix) { | |
| if (Name.find(Prefix) == 0) { | |
| for (size_t i = Prefix.size(); i < Name.size(); ++i) { | |
| if (!isdigit(Name[i])) { | |
| return false; | |
| } | |
| } | |
| OstreamLocker L(Ctx); | |
| Ostream &Stream = Ctx->getStrDump(); | |
| Stream << "Warning : Default " << Kind << " prefix '" << Prefix | |
| << "' potentially conflicts with name '" << Name << "'.\n"; | |
| return true; | |
| } | |
| return false; | |
| } | |
| void Translator::translateFcn(std::unique_ptr<Cfg> Func) { | |
| Ctx->optQueueBlockingPush(makeUnique<CfgOptWorkItem>(std::move(Func))); | |
| } | |
| void Translator::lowerGlobals( | |
| std::unique_ptr<VariableDeclarationList> VariableDeclarations) { | |
| Ctx->emitQueueBlockingPush(makeUnique<EmitterWorkItem>( | |
| getNextSequenceNumber(), std::move(VariableDeclarations))); | |
| } | |
| } // end of namespace Ice |