Beginning of LLVM backend for ART.
Change-Id: I03466aed94670ac72d489ebc6e34d7ee1c9c857e
diff --git a/src/compiler_llvm/ir_builder.h b/src/compiler_llvm/ir_builder.h
new file mode 100644
index 0000000..03ca2d7
--- /dev/null
+++ b/src/compiler_llvm/ir_builder.h
@@ -0,0 +1,214 @@
+/*
+ * 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_IR_BUILDER_H_
+#define ART_SRC_COMPILER_LLVM_IR_BUILDER_H_
+
+#include "backend_types.h"
+
+#include <llvm/Constants.h>
+#include <llvm/DerivedTypes.h>
+#include <llvm/Support/IRBuilder.h>
+#include <llvm/Type.h>
+
+#include <stdint.h>
+
+
+namespace art {
+namespace compiler_llvm {
+
+
+typedef llvm::IRBuilder<> LLVMIRBuilder;
+// NOTE: Here we define our own LLVMIRBuilder type alias, so that we can
+// switch "preserveNames" template parameter easily.
+
+
+class IRBuilder : public LLVMIRBuilder {
+ public:
+ //--------------------------------------------------------------------------
+ // General
+ //--------------------------------------------------------------------------
+
+ IRBuilder(llvm::LLVMContext& context, llvm::Module& module);
+
+
+ //--------------------------------------------------------------------------
+ // Type Helper Function
+ //--------------------------------------------------------------------------
+
+ llvm::Type* getJType(char shorty_jty, JTypeSpace space) {
+ return getJType(GetJTypeFromShorty(shorty_jty), space);
+ }
+
+ llvm::Type* getJType(JType jty, JTypeSpace space) {
+ switch (space) {
+ case kAccurate:
+ return getJTypeInAccurateSpace(jty);
+
+ case kReg:
+ case kField: // Currently field space is equivalent to register space.
+ return getJTypeInRegSpace(jty);
+
+ case kArray:
+ return getJTypeInArraySpace(jty);
+ }
+
+ return NULL;
+ }
+
+ llvm::Type* getJVoidTy() {
+ return getVoidTy();
+ }
+
+ llvm::IntegerType* getJBooleanTy() {
+ return getInt1Ty();
+ }
+
+ llvm::IntegerType* getJByteTy() {
+ return getInt8Ty();
+ }
+
+ llvm::IntegerType* getJCharTy() {
+ return getInt16Ty();
+ }
+
+ llvm::IntegerType* getJShortTy() {
+ return getInt16Ty();
+ }
+
+ llvm::IntegerType* getJIntTy() {
+ return getInt32Ty();
+ }
+
+ llvm::IntegerType* getJLongTy() {
+ return getInt64Ty();
+ }
+
+ llvm::Type* getJFloatTy() {
+ return getFloatTy();
+ }
+
+ llvm::Type* getJDoubleTy() {
+ return getDoubleTy();
+ }
+
+ llvm::PointerType* getJObjectTy() {
+ return jobject_type_;
+ }
+
+
+ //--------------------------------------------------------------------------
+ // Constant Value Helper Function
+ //--------------------------------------------------------------------------
+
+ llvm::ConstantInt* getJBoolean(bool is_true) {
+ return (is_true) ? getTrue() : getFalse();
+ }
+
+ llvm::ConstantInt* getJByte(int8_t i) {
+ return llvm::ConstantInt::getSigned(getJByteTy(), i);
+ }
+
+ llvm::ConstantInt* getJChar(int16_t i) {
+ return llvm::ConstantInt::getSigned(getJCharTy(), i);
+ }
+
+ llvm::ConstantInt* getJShort(int16_t i) {
+ return llvm::ConstantInt::getSigned(getJShortTy(), i);
+ }
+
+ llvm::ConstantInt* getJInt(int32_t i) {
+ return llvm::ConstantInt::getSigned(getJIntTy(), i);
+ }
+
+ llvm::ConstantInt* getJLong(int64_t i) {
+ return llvm::ConstantInt::getSigned(getJLongTy(), i);
+ }
+
+ llvm::Constant* getJFloat(float f) {
+ return llvm::ConstantFP::get(getJFloatTy(), f);
+ }
+
+ llvm::Constant* getJDouble(double d) {
+ return llvm::ConstantFP::get(getJDoubleTy(), d);
+ }
+
+ llvm::ConstantPointerNull* getJNull() {
+ return llvm::ConstantPointerNull::get(getJObjectTy());
+ }
+
+ llvm::Constant* getJZero(char shorty_jty) {
+ return getJZero(GetJTypeFromShorty(shorty_jty));
+ }
+
+ llvm::Constant* getJZero(JType jty) {
+ switch (jty) {
+ case kVoid:
+ return NULL;
+
+ case kBoolean:
+ return getJBoolean(false);
+
+ case kByte:
+ return getJByte(0);
+
+ case kChar:
+ return getJChar(0);
+
+ case kShort:
+ return getJShort(0);
+
+ case kInt:
+ return getJInt(0);
+
+ case kLong:
+ return getJLong(0);
+
+ case kFloat:
+ return getJFloat(0.0f);
+
+ case kDouble:
+ return getJDouble(0.0);
+
+ case kObject:
+ return getJNull();
+ }
+
+ LOG(FATAL) << "Unknown java type: " << jty;
+ return NULL;
+ }
+
+
+ private:
+ //--------------------------------------------------------------------------
+ // Type Helper Function (Private)
+ //--------------------------------------------------------------------------
+
+ llvm::Type* getJTypeInAccurateSpace(JType jty);
+ llvm::Type* getJTypeInRegSpace(JType jty);
+ llvm::Type* getJTypeInArraySpace(JType jty);
+
+
+ private:
+ llvm::PointerType* jobject_type_;
+
+};
+
+
+} // namespace compiler_llvm
+} // namespace art
+
+#endif // ART_SRC_COMPILER_LLVM_IR_BUILDER_H_