Commit 8d7abae9 by Karl Schimpf

Update Subzero to start parsing PNaCl bitcode files.

This patch only handles global addresses in PNaCl bitcode files. Function blocks are still not parsed. Also, factors out a common API for translation, so that generated ICE can always be translated using the same code. BUG= https://code.google.com/p/nativeclient/issues/detail?id=3892 R=jvoung@chromium.org, stichnot@chromium.org Review URL: https://codereview.chromium.org/361733002
parent de4ca71e
...@@ -30,7 +30,7 @@ LLVM_LDFLAGS := `$(LLVM_BIN_PATH)/llvm-config --ldflags --libs` ...@@ -30,7 +30,7 @@ LLVM_LDFLAGS := `$(LLVM_BIN_PATH)/llvm-config --ldflags --libs`
OPTLEVEL := -O0 OPTLEVEL := -O0
CXX := g++ CXX := g++
CXXFLAGS := -Wall -Wextra -Werror -fno-rtti -fno-exceptions \ CXXFLAGS := -Wall -Wextra -Werror -fno-rtti -fno-exceptions \
$(OPTLEVEL) -g $(LLVM_CXXFLAGS) -m32 $(OPTLEVEL) -g $(LLVM_CXXFLAGS) -m32 -Wno-error=unused-parameter
LDFLAGS := -m32 LDFLAGS := -m32
SRCS= \ SRCS= \
...@@ -46,8 +46,10 @@ SRCS= \ ...@@ -46,8 +46,10 @@ SRCS= \
IceRegAlloc.cpp \ IceRegAlloc.cpp \
IceTargetLowering.cpp \ IceTargetLowering.cpp \
IceTargetLoweringX8632.cpp \ IceTargetLoweringX8632.cpp \
IceTranslator.cpp \
IceTypes.cpp \ IceTypes.cpp \
llvm2ice.cpp llvm2ice.cpp \
PNaClTranslator.cpp
OBJS=$(patsubst %.cpp, build/%.o, $(SRCS)) OBJS=$(patsubst %.cpp, build/%.o, $(SRCS))
......
//===- subzero/src/IceClFlags.h - Cl Flags for translation ------*- C++ -*-===//
//
// The Subzero Code Generator
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file declares command line flags controlling translation.
//
//===----------------------------------------------------------------------===//
#ifndef SUBZERO_SRC_ICECLFLAGS_H
#define SUBZERO_SRC_ICECLFLAGS_H
namespace Ice {
class ClFlags {
public:
ClFlags()
: DisableInternal(false), SubzeroTimingEnabled(false),
DisableTranslation(false) {}
bool DisableInternal;
bool SubzeroTimingEnabled;
bool DisableTranslation;
};
}
#endif // SUBZERO_SRC_ICECLFLAGS_H
...@@ -15,11 +15,11 @@ ...@@ -15,11 +15,11 @@
#include "IceCfg.h" #include "IceCfg.h"
#include "IceCfgNode.h" #include "IceCfgNode.h"
#include "IceClFlags.h"
#include "IceDefs.h" #include "IceDefs.h"
#include "IceGlobalContext.h" #include "IceGlobalContext.h"
#include "IceInst.h" #include "IceInst.h"
#include "IceOperand.h" #include "IceOperand.h"
#include "IceTargetLowering.h"
#include "IceTypes.h" #include "IceTypes.h"
#include "llvm/IR/Constant.h" #include "llvm/IR/Constant.h"
...@@ -616,64 +616,24 @@ private: ...@@ -616,64 +616,24 @@ private:
std::map<const BasicBlock *, Ice::CfgNode *> NodeMap; std::map<const BasicBlock *, Ice::CfgNode *> NodeMap;
}; };
} } // end of anonymous namespace.
int Ice::Converter::convertToIce(llvm::Module *Mod) { int Ice::Converter::convertToIce(llvm::Module *Mod) {
int ExitStatus = 0;
// Ideally, Func would be declared inside the loop and its object
// would be automatically deleted at the end of the loop iteration.
// However, emitting the constant pool requires a valid Cfg object,
// so we need to defer deleting the last non-empty Cfg object until
// outside the loop and after emitting the constant pool. TODO:
// Since all constants are globally pooled in the Ice::GlobalContext
// object, change all Ice::Constant related functions to use
// GlobalContext instead of Cfg, and then clean up this loop.
OwningPtr<Ice::Cfg> Func;
for (Module::const_iterator I = Mod->begin(), E = Mod->end(); I != E; ++I) { for (Module::const_iterator I = Mod->begin(), E = Mod->end(); I != E; ++I) {
if (I->empty()) if (I->empty())
continue; continue;
LLVM2ICEConverter FunctionConverter(Ctx); LLVM2ICEConverter FunctionConverter(Ctx);
Ice::Timer TConvert; Ice::Timer TConvert;
Func.reset(FunctionConverter.convertFunction(I)); Ice::Cfg *Fcn = FunctionConverter.convertFunction(I);
if (DisableInternal) if (Flags.SubzeroTimingEnabled) {
Func->setInternal(false);
if (SubzeroTimingEnabled) {
std::cerr << "[Subzero timing] Convert function " std::cerr << "[Subzero timing] Convert function "
<< Func->getFunctionName() << ": " << TConvert.getElapsedSec() << Fcn->getFunctionName() << ": " << TConvert.getElapsedSec()
<< " sec\n";
}
if (DisableTranslation) {
Func->dump();
} else {
Ice::Timer TTranslate;
Func->translate();
if (SubzeroTimingEnabled) {
std::cerr << "[Subzero timing] Translate function "
<< Func->getFunctionName() << ": "
<< TTranslate.getElapsedSec() << " sec\n";
}
if (Func->hasError()) {
errs() << "ICE translation error: " << Func->getError() << "\n";
ExitStatus = 1;
}
Ice::Timer TEmit;
Func->emit();
if (SubzeroTimingEnabled) {
std::cerr << "[Subzero timing] Emit function "
<< Func->getFunctionName() << ": " << TEmit.getElapsedSec()
<< " sec\n"; << " sec\n";
} }
translateFcn(Fcn);
} }
}
if (!DisableTranslation && Func)
Func->getTarget()->emitConstants();
emitConstants();
return ExitStatus; return ExitStatus;
} }
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
#ifndef SUBZERO_SRC_ICECONVERTER_H #ifndef SUBZERO_SRC_ICECONVERTER_H
#define SUBZERO_SRC_ICECONVERTER_H #define SUBZERO_SRC_ICECONVERTER_H
#include "IceGlobalContext.h" #include "IceTranslator.h"
namespace llvm { namespace llvm {
class Module; class Module;
...@@ -22,27 +22,17 @@ class Module; ...@@ -22,27 +22,17 @@ class Module;
namespace Ice { namespace Ice {
class Converter { class Converter : public Translator {
public: public:
Converter(Ice::GlobalContext *Ctx, Converter(GlobalContext *Ctx, Ice::ClFlags &Flags) : Translator(Ctx, Flags) {}
bool DisableInternal,
bool SubzeroTimingEnabled,
bool DisableTranslation)
: Ctx(Ctx),
DisableInternal(DisableInternal),
SubzeroTimingEnabled(SubzeroTimingEnabled),
DisableTranslation(DisableTranslation)
{}
/// Converts the LLVM Module to ICE. Returns exit status 0 if successful, /// Converts the LLVM Module to ICE. Returns exit status 0 if successful,
/// Nonzero otherwise. /// Nonzero otherwise.
int convertToIce(llvm::Module *Mod); int convertToIce(llvm::Module *Mod);
private: private:
Ice::GlobalContext *Ctx; Converter(const Converter &) LLVM_DELETED_FUNCTION;
bool DisableInternal; Converter &operator=(const Converter &) LLVM_DELETED_FUNCTION;
bool SubzeroTimingEnabled;
bool DisableTranslation;
}; };
} }
#endif // SUBZERO_SRC_ICECONVERTER_H #endif // SUBZERO_SRC_ICECONVERTER_H
//===- 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.
//
//===----------------------------------------------------------------------===//
//
// This file defines the general driver class for translating ICE to
// machine code.
//
//===----------------------------------------------------------------------===//
#include "IceTranslator.h"
#include "IceCfg.h"
#include "IceClFlags.h"
#include "IceTargetLowering.h"
#include <iostream>
using namespace Ice;
Translator::~Translator() {}
void Translator::translateFcn(Ice::Cfg *Fcn) {
Func.reset(Fcn);
if (Flags.DisableInternal)
Func->setInternal(false);
if (Flags.DisableTranslation) {
Func->dump();
} else {
Ice::Timer TTranslate;
Func->translate();
if (Flags.SubzeroTimingEnabled) {
std::cerr << "[Subzero timing] Translate function "
<< Func->getFunctionName() << ": " << TTranslate.getElapsedSec()
<< " sec\n";
}
if (Func->hasError()) {
std::cerr << "ICE translation error: " << Func->getError() << "\n";
ExitStatus = 1;
}
Ice::Timer TEmit;
Func->emit();
if (Flags.SubzeroTimingEnabled) {
std::cerr << "[Subzero timing] Emit function " << Func->getFunctionName()
<< ": " << TEmit.getElapsedSec() << " sec\n";
}
}
}
void Translator::emitConstants() {
if (!Flags.DisableTranslation && Func)
Func->getTarget()->emitConstants();
}
//===- 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.
//
//===----------------------------------------------------------------------===//
//
// This file declares the general driver class for translating ICE to
// machine code.
//
//===----------------------------------------------------------------------===//
#ifndef SUBZERO_SRC_ICETRANSLATOR_H
#define SUBZERO_SRC_ICETRANSLATOR_H
#include "llvm/ADT/OwningPtr.h"
namespace Ice {
class ClFlags;
class Cfg;
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 {
public:
Translator(GlobalContext *Ctx, ClFlags &Flags)
: Ctx(Ctx), Flags(Flags), ExitStatus(0) {}
~Translator();
int getExitStatus() const { return ExitStatus; }
protected:
GlobalContext *Ctx;
ClFlags &Flags;
// The exit status of the translation. 0 is successful. Nonzero
// otherwise.
bool ExitStatus;
// Ideally, Func would be inside the methods that converts IR to
// functions. However, emitting the constant pool requires a valid
// Cfg object, so we need to defer deleting the last non-empty Cfg
// object to emit the constant pool (via emitConstants). TODO:
// Since all constants are globally pooled in the GlobalContext
// object, change all Constant related functions to use
// GlobalContext instead of Cfg, and then make emitConstantPool use
// that.
llvm::OwningPtr<Cfg> Func;
/// Translates the constructed ICE function Fcn to machine code.
/// Note: As a side effect, Field Func is set to Fcn.
void translateFcn(Cfg *Fcn);
/// Emits the constant pool.
void emitConstants();
private:
Translator(const Translator &) LLVM_DELETED_FUNCTION;
Translator &operator=(const Translator &) LLVM_DELETED_FUNCTION;
};
}
#endif // SUBZERO_SRC_ICETRANSLATOR_H
//===- subzero/src/PNaClTranslator.h - ICE from bitcode ---------*- C++ -*-===//
//
// The Subzero Code Generator
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file declares the PNaCl bitcode file to ICE, to machine code
// translator.
//
//===----------------------------------------------------------------------===//
#ifndef SUBZERO_SRC_PNACLTRANSLATOR_H
#define SUBZERO_SRC_PNACLTRANSLATOR_H
#include "IceTranslator.h"
#include <string>
namespace Ice {
class PNaClTranslator : public Translator {
public:
PNaClTranslator(GlobalContext *Ctx, ClFlags &Flags)
: Translator(Ctx, Flags) {}
// Reads the PNaCl bitcode file and translates to ICE, which is then
// converted to machine code. Sets ExitStatus to non-zero if any
// errors occurred.
void translate(const std::string &IRFilename);
private:
PNaClTranslator(const PNaClTranslator &) LLVM_DELETED_FUNCTION;
PNaClTranslator &operator=(const PNaClTranslator &) LLVM_DELETED_FUNCTION;
};
}
#endif // SUBZERO_SRC_PNACLTRANSLATOR_H
...@@ -14,12 +14,13 @@ ...@@ -14,12 +14,13 @@
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
#include "IceCfg.h" #include "IceCfg.h"
#include "IceClFlags.h"
#include "IceConverter.h" #include "IceConverter.h"
#include "IceDefs.h" #include "IceDefs.h"
#include "IceTargetLowering.h" #include "IceTargetLowering.h"
#include "IceTypes.h" #include "IceTypes.h"
#include "PNaClTranslator.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/Constants.h" #include "llvm/IR/Constants.h"
#include "llvm/IR/LLVMContext.h" #include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h" #include "llvm/IR/Module.h"
...@@ -128,9 +129,15 @@ int main(int argc, char **argv) { ...@@ -128,9 +129,15 @@ int main(int argc, char **argv) {
Ice::GlobalContext Ctx(Ls, Os, VMask, TargetArch, OptLevel, TestPrefix); Ice::GlobalContext Ctx(Ls, Os, VMask, TargetArch, OptLevel, TestPrefix);
Ice::ClFlags Flags;
Flags.DisableInternal = DisableInternal;
Flags.SubzeroTimingEnabled = SubzeroTimingEnabled;
Flags.DisableTranslation = DisableTranslation;
if (BuildOnRead) { if (BuildOnRead) {
std::cerr << "Direct build from bitcode not implemented yet!\n"; Ice::PNaClTranslator Translator(&Ctx, Flags);
return 1; Translator.translate(IRFilename);
return Translator.getExitStatus();
} else { } else {
// Parse the input LLVM IR file into a module. // Parse the input LLVM IR file into a module.
SMDiagnostic Err; SMDiagnostic Err;
...@@ -189,8 +196,7 @@ int main(int argc, char **argv) { ...@@ -189,8 +196,7 @@ int main(int argc, char **argv) {
} }
GlobalLowering.reset(); GlobalLowering.reset();
Ice::Converter Converter(&Ctx, DisableInternal, SubzeroTimingEnabled, Ice::Converter Converter(&Ctx, Flags);
DisableTranslation);
return Converter.convertToIce(Mod); return Converter.convertToIce(Mod);
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment