Add codegen support to the optimizing compiler.
Change-Id: I9aae76908ff1d6e64fb71a6718fc1426b67a5c28
diff --git a/compiler/optimizing/code_generator.cc b/compiler/optimizing/code_generator.cc
new file mode 100644
index 0000000..01fc23b
--- /dev/null
+++ b/compiler/optimizing/code_generator.cc
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2014 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.
+ */
+
+#include "code_generator.h"
+
+#include "code_generator_arm.h"
+#include "code_generator_x86.h"
+#include "utils/assembler.h"
+#include "utils/arm/assembler_arm.h"
+#include "utils/mips/assembler_mips.h"
+#include "utils/x86/assembler_x86.h"
+
+namespace art {
+
+void CodeGenerator::Compile(CodeAllocator* allocator) {
+ GenerateFrameEntry();
+ const GrowableArray<HBasicBlock*>* blocks = graph()->blocks();
+ for (size_t i = 0; i < blocks->Size(); i++) {
+ CompileBlock(blocks->Get(i));
+ }
+ size_t code_size = assembler_->CodeSize();
+ uint8_t* buffer = allocator->Allocate(code_size);
+ MemoryRegion code(buffer, code_size);
+ assembler_->FinalizeInstructions(code);
+}
+
+void CodeGenerator::CompileBlock(HBasicBlock* block) {
+ Bind(GetLabelOf(block));
+ for (HInstructionIterator it(block); !it.Done(); it.Advance()) {
+ it.Current()->Accept(this);
+ }
+}
+
+bool CodeGenerator::GoesToNextBlock(HGoto* goto_instruction) const {
+ HBasicBlock* successor = goto_instruction->GetSuccessor();
+ // We currently iterate over the block in insertion order.
+ return goto_instruction->block()->block_id() + 1 == successor->block_id();
+}
+
+Label* CodeGenerator::GetLabelOf(HBasicBlock* block) const {
+ return block_labels_.GetRawStorage() + block->block_id();
+}
+
+bool CodeGenerator::CompileGraph(HGraph* graph,
+ InstructionSet instruction_set,
+ CodeAllocator* allocator) {
+ switch (instruction_set) {
+ case kArm:
+ case kThumb2: {
+ arm::ArmAssembler assembler;
+ arm::CodeGeneratorARM(&assembler, graph).Compile(allocator);
+ return true;
+ }
+ case kMips:
+ return false;
+ case kX86: {
+ x86::X86Assembler assembler;
+ x86::CodeGeneratorX86(&assembler, graph).Compile(allocator);
+ return true;
+ }
+ default:
+ return false;
+ }
+}
+
+} // namespace art