Home | History | Annotate | Download | only in src
      1 //===- subzero/src/IceTranslator.cpp - ICE to machine code ------*- C++ -*-===//
      2 //
      3 //                        The Subzero Code Generator
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 ///
     10 /// \file
     11 /// \brief Defines the general driver class for translating ICE to machine code.
     12 ///
     13 //===----------------------------------------------------------------------===//
     14 
     15 #include "IceTranslator.h"
     16 
     17 #include "IceDefs.h"
     18 #include "IceCfg.h"
     19 #include "IceClFlags.h"
     20 #include "IceGlobalInits.h"
     21 #include "IceTargetLowering.h"
     22 
     23 #include <utility>
     24 
     25 namespace Ice {
     26 
     27 Translator::Translator(GlobalContext *Ctx)
     28     : Ctx(Ctx), NextSequenceNumber(GlobalContext::getFirstSequenceNumber()),
     29       ErrorStatus() {}
     30 
     31 std::string Translator::createUnnamedName(const std::string &Prefix,
     32                                           SizeT Index) {
     33   if (Index == 0)
     34     return Prefix;
     35   std::string Buffer;
     36   llvm::raw_string_ostream StrBuf(Buffer);
     37   StrBuf << Prefix << Index;
     38   return StrBuf.str();
     39 }
     40 
     41 bool Translator::checkIfUnnamedNameSafe(const std::string &Name,
     42                                         const char *Kind,
     43                                         const std::string &Prefix) {
     44   if (Name.find(Prefix) == 0) {
     45     for (size_t i = Prefix.size(); i < Name.size(); ++i) {
     46       if (!isdigit(Name[i])) {
     47         return false;
     48       }
     49     }
     50     OstreamLocker L(Ctx);
     51     Ostream &Stream = Ctx->getStrDump();
     52     Stream << "Warning : Default " << Kind << " prefix '" << Prefix
     53            << "' potentially conflicts with name '" << Name << "'.\n";
     54     return true;
     55   }
     56   return false;
     57 }
     58 
     59 void Translator::translateFcn(std::unique_ptr<Cfg> Func) {
     60   Ctx->optQueueBlockingPush(makeUnique<CfgOptWorkItem>(std::move(Func)));
     61 }
     62 
     63 void Translator::lowerGlobals(
     64     std::unique_ptr<VariableDeclarationList> VariableDeclarations) {
     65   Ctx->emitQueueBlockingPush(makeUnique<EmitterWorkItem>(
     66       getNextSequenceNumber(), std::move(VariableDeclarations)));
     67 }
     68 
     69 } // end of namespace Ice
     70