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_