Index: src/llvm2ice.cpp |
diff --git a/src/llvm2ice.cpp b/src/llvm2ice.cpp |
index 08f90f8132727f84c8f9b271275da01f04b62f39..e29637dea85e5aa54449088e57985a57263627d8 100644 |
--- a/src/llvm2ice.cpp |
+++ b/src/llvm2ice.cpp |
@@ -19,6 +19,7 @@ |
#include "IceGlobalContext.h" |
#include "IceInst.h" |
#include "IceOperand.h" |
+#include "IceTargetLowering.h" |
#include "IceTypes.h" |
#include "llvm/IR/Constant.h" |
@@ -63,6 +64,7 @@ public: |
SubzeroPointerType = Ice::IceType_i32; |
} |
+ // Caller is expected to delete the returned Ice::Cfg object. |
Ice::Cfg *convertFunction(const Function *F) { |
VarMap.clear(); |
NodeMap.clear(); |
@@ -618,14 +620,11 @@ DisableTranslation("notranslate", cl::desc("Disable Subzero translation")); |
static cl::opt<bool> SubzeroTimingEnabled( |
"timing", cl::desc("Enable breakdown timing of Subzero translation")); |
-static cl::opt<NaClFileFormat> |
-InputFileFormat( |
- "bitcode-format", |
- cl::desc("Define format of input file:"), |
- cl::values( |
- clEnumValN(LLVMFormat, "llvm", "LLVM file (default)"), |
- clEnumValN(PNaClFormat, "pnacl", "PNaCl bitcode file"), |
- clEnumValEnd), |
+static cl::opt<NaClFileFormat> InputFileFormat( |
+ "bitcode-format", cl::desc("Define format of input file:"), |
+ cl::values(clEnumValN(LLVMFormat, "llvm", "LLVM file (default)"), |
+ clEnumValN(PNaClFormat, "pnacl", "PNaCl bitcode file"), |
+ clEnumValEnd), |
cl::init(LLVMFormat)); |
int main(int argc, char **argv) { |
@@ -670,6 +669,15 @@ int main(int argc, char **argv) { |
raw_os_ostream *Ls = new raw_os_ostream(LogFilename == "-" ? std::cout : Lfs); |
Ls->SetUnbuffered(); |
+ // 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; |
Ice::GlobalContext Ctx(Ls, Os, VMask, TargetArch, OptLevel, TestPrefix); |
for (Module::const_iterator I = Mod->begin(), E = Mod->end(); I != E; ++I) { |
@@ -678,7 +686,7 @@ int main(int argc, char **argv) { |
LLVM2ICEConverter FunctionConverter(&Ctx); |
Ice::Timer TConvert; |
- Ice::Cfg *Func = FunctionConverter.convertFunction(I); |
+ Func.reset(FunctionConverter.convertFunction(I)); |
if (DisableInternal) |
Func->setInternal(false); |
@@ -713,5 +721,8 @@ int main(int argc, char **argv) { |
} |
} |
+ if (!DisableTranslation && Func) |
+ Func->getTarget()->emitConstants(); |
+ |
return ExitStatus; |
} |