Compile llvm.Module into ELF object file.
Change-Id: I8faf7427944324c9bac12573d217cde2a2e658f1
diff --git a/src/compiler_llvm/compilation_unit.h b/src/compiler_llvm/compilation_unit.h
new file mode 100644
index 0000000..a10d977
--- /dev/null
+++ b/src/compiler_llvm/compilation_unit.h
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ART_SRC_COMPILER_LLVM_COMPILATION_UNIT_H_
+#define ART_SRC_COMPILER_LLVM_COMPILATION_UNIT_H_
+
+#include "constants.h"
+#include "logging.h"
+
+#include <UniquePtr.h>
+#include <string>
+
+namespace llvm {
+ class LLVMContext;
+ class Module;
+}
+
+namespace art {
+namespace compiler_llvm {
+
+class IRBuilder;
+
+class CompilationUnit {
+ public:
+ CompilationUnit(InstructionSet insn_set);
+
+ ~CompilationUnit();
+
+ InstructionSet GetInstructionSet() const {
+ return insn_set_;
+ }
+
+ llvm::LLVMContext* GetLLVMContext() const {
+ return context_.get();
+ }
+
+ llvm::Module* GetModule() const {
+ return module_;
+ }
+
+ IRBuilder* GetIRBuilder() const {
+ return irb_.get();
+ }
+
+ std::string const& GetElfFileName() const {
+ CHECK(IsFinalized());
+ return elf_filename_;
+ }
+
+ std::string const& GetBitcodeFileName() const {
+ CHECK(IsFinalized());
+ return bitcode_filename_;
+ }
+
+ void SetElfFileName(std::string const& filename) {
+ elf_filename_ = filename;
+ }
+
+ void SetBitcodeFileName(std::string const& filename) {
+ bitcode_filename_ = filename;
+ }
+
+ bool WriteBitcodeToFile();
+
+ bool Materialize();
+
+ bool IsFinalized() const {
+ return (context_.get() == NULL);
+ }
+
+ void Finalize();
+
+ bool IsMaterializeThresholdReached() const {
+ return (mem_usage_ > 300000000u); // (threshold: 300 MB)
+ }
+
+ void AddMemUsageApproximation(size_t usage) {
+ mem_usage_ += usage;
+ }
+
+ private:
+ InstructionSet insn_set_;
+
+ UniquePtr<llvm::LLVMContext> context_;
+ UniquePtr<IRBuilder> irb_;
+ llvm::Module* module_;
+
+ std::string elf_filename_;
+ std::string bitcode_filename_;
+
+ size_t mem_usage_;
+};
+
+} // namespace compiler_llvm
+} // namespace art
+
+#endif // ART_SRC_COMPILER_LLVM_COMPILATION_UNIT_H_