blob: e4fedf1ab47c0be9e3713c9f9208728c016505c9 [file] [log] [blame]
Elliott Hughes2faa5f12012-01-30 14:42:07 -08001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Brian Carlstrom3320cf42011-10-04 14:58:28 -070016
Mathieu Chartier193bad92013-08-29 18:46:00 -070017#ifndef ART_COMPILER_COMPILED_METHOD_H_
18#define ART_COMPILER_COMPILED_METHOD_H_
Brian Carlstrom3320cf42011-10-04 14:58:28 -070019
Brian Carlstrom265091e2013-01-30 14:08:26 -080020#include <string>
Brian Carlstrom3320cf42011-10-04 14:58:28 -070021#include <vector>
22
Elliott Hughes0f3c5532012-03-30 14:51:51 -070023#include "instruction_set.h"
Brian Carlstrom3320cf42011-10-04 14:58:28 -070024#include "utils.h"
TDYa127eead4ac2012-06-03 07:15:25 -070025#include "UniquePtr.h"
Brian Carlstrom3320cf42011-10-04 14:58:28 -070026
Shih-wei Liaod1fec812012-02-13 09:51:10 -080027namespace llvm {
28 class Function;
Ian Rogersa1827042013-04-18 16:36:43 -070029} // namespace llvm
Shih-wei Liaod1fec812012-02-13 09:51:10 -080030
Brian Carlstrom3320cf42011-10-04 14:58:28 -070031namespace art {
32
Mathieu Chartier193bad92013-08-29 18:46:00 -070033class CompilerDriver;
34
Logan Chien598c5132012-04-28 22:00:44 +080035class CompiledCode {
36 public:
Brian Carlstrom265091e2013-01-30 14:08:26 -080037 // For Quick to supply an code blob
Mathieu Chartier193bad92013-08-29 18:46:00 -070038 CompiledCode(CompilerDriver* compiler_driver, InstructionSet instruction_set,
39 const std::vector<uint8_t>& code);
Logan Chien598c5132012-04-28 22:00:44 +080040
Brian Carlstrom265091e2013-01-30 14:08:26 -080041 // For Portable to supply an ELF object
Mathieu Chartier193bad92013-08-29 18:46:00 -070042 CompiledCode(CompilerDriver* compiler_driver, InstructionSet instruction_set,
43 const std::string& elf_object, const std::string &symbol);
Logan Chien598c5132012-04-28 22:00:44 +080044
Logan Chien598c5132012-04-28 22:00:44 +080045 InstructionSet GetInstructionSet() const {
46 return instruction_set_;
47 }
48
49 const std::vector<uint8_t>& GetCode() const {
Mathieu Chartier193bad92013-08-29 18:46:00 -070050 return *code_;
Logan Chien598c5132012-04-28 22:00:44 +080051 }
52
Mathieu Chartier193bad92013-08-29 18:46:00 -070053 void SetCode(const std::vector<uint8_t>& code);
Logan Chien598c5132012-04-28 22:00:44 +080054
55 bool operator==(const CompiledCode& rhs) const {
56 return (code_ == rhs.code_);
57 }
58
Logan Chien598c5132012-04-28 22:00:44 +080059 // To align an offset from a page-aligned value to make it suitable
60 // for code storage. For example on ARM, to ensure that PC relative
61 // valu computations work out as expected.
62 uint32_t AlignCode(uint32_t offset) const;
63 static uint32_t AlignCode(uint32_t offset, InstructionSet instruction_set);
64
65 // returns the difference between the code address and a usable PC.
66 // mainly to cope with kThumb2 where the lower bit must be set.
67 size_t CodeDelta() const;
68
69 // Returns a pointer suitable for invoking the code at the argument
70 // code_pointer address. Mainly to cope with kThumb2 where the
71 // lower bit must be set to indicate Thumb mode.
72 static const void* CodePointer(const void* code_pointer,
73 InstructionSet instruction_set);
74
Brian Carlstrom265091e2013-01-30 14:08:26 -080075#if defined(ART_USE_PORTABLE_COMPILER)
76 const std::string& GetSymbol() const;
77 const std::vector<uint32_t>& GetOatdataOffsetsToCompliledCodeOffset() const;
78 void AddOatdataOffsetToCompliledCodeOffset(uint32_t offset);
79#endif
80
Logan Chien598c5132012-04-28 22:00:44 +080081 private:
Mathieu Chartier193bad92013-08-29 18:46:00 -070082 CompilerDriver* compiler_driver_;
83
Logan Chien598c5132012-04-28 22:00:44 +080084 const InstructionSet instruction_set_;
Brian Carlstrom8227cc12013-03-06 14:26:48 -080085
Brian Carlstrom265091e2013-01-30 14:08:26 -080086 // Used to store the PIC code for Quick and an ELF image for portable.
Mathieu Chartier193bad92013-08-29 18:46:00 -070087 std::vector<uint8_t>* code_;
Brian Carlstrom265091e2013-01-30 14:08:26 -080088
89 // Used for the Portable ELF symbol name.
Ian Rogersa1827042013-04-18 16:36:43 -070090 const std::string symbol_;
Brian Carlstrom265091e2013-01-30 14:08:26 -080091
92 // There are offsets from the oatdata symbol to where the offset to
93 // the compiled method will be found. These are computed by the
94 // OatWriter and then used by the ElfWriter to add relocations so
95 // that MCLinker can update the values to the location in the linked .so.
96 std::vector<uint32_t> oatdata_offsets_to_compiled_code_offset_;
Logan Chien598c5132012-04-28 22:00:44 +080097};
98
99class CompiledMethod : public CompiledCode {
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700100 public:
Elliott Hughes3fa1b7e2012-03-13 17:06:22 -0700101 // Constructs a CompiledMethod for the non-LLVM compilers.
Mathieu Chartier193bad92013-08-29 18:46:00 -0700102 CompiledMethod(CompilerDriver& driver,
103 InstructionSet instruction_set,
Ian Rogersab058bb2012-03-11 22:19:38 -0700104 const std::vector<uint8_t>& code,
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700105 const size_t frame_size_in_bytes,
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700106 const uint32_t core_spill_mask,
107 const uint32_t fp_spill_mask,
Ian Rogers96faf5b2013-08-09 22:05:32 -0700108 const std::vector<uint8_t>& mapping_table,
109 const std::vector<uint8_t>& vmap_table,
Ian Rogers0c7abda2012-09-19 13:33:42 -0700110 const std::vector<uint8_t>& native_gc_map);
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700111
Elliott Hughes3fa1b7e2012-03-13 17:06:22 -0700112 // Constructs a CompiledMethod for the JniCompiler.
Mathieu Chartier193bad92013-08-29 18:46:00 -0700113 CompiledMethod(CompilerDriver& driver,
114 InstructionSet instruction_set,
Brian Carlstrome7d856b2012-01-11 18:10:55 -0800115 const std::vector<uint8_t>& code,
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700116 const size_t frame_size_in_bytes,
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700117 const uint32_t core_spill_mask,
118 const uint32_t fp_spill_mask);
119
Brian Carlstrom265091e2013-01-30 14:08:26 -0800120 // Constructs a CompiledMethod for the Portable compiler.
Mathieu Chartier193bad92013-08-29 18:46:00 -0700121 CompiledMethod(CompilerDriver& driver, InstructionSet instruction_set, const std::string& code,
122 const std::vector<uint8_t>& gc_map, const std::string& symbol);
TDYa127ce4cc0d2012-11-18 16:59:53 -0800123
Brian Carlstrom265091e2013-01-30 14:08:26 -0800124 // Constructs a CompiledMethod for the Portable JniCompiler.
Mathieu Chartier193bad92013-08-29 18:46:00 -0700125 CompiledMethod(CompilerDriver& driver, InstructionSet instruction_set, const std::string& code,
126 const std::string& symbol);
Logan Chien6920bce2012-03-17 21:44:01 +0800127
Ian Rogers0c7abda2012-09-19 13:33:42 -0700128 ~CompiledMethod() {}
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700129
Ian Rogers0c7abda2012-09-19 13:33:42 -0700130 size_t GetFrameSizeInBytes() const {
131 return frame_size_in_bytes_;
Logan Chien110bcba2012-04-16 19:11:28 +0800132 }
Ian Rogers0c7abda2012-09-19 13:33:42 -0700133
134 uint32_t GetCoreSpillMask() const {
135 return core_spill_mask_;
136 }
137
138 uint32_t GetFpSpillMask() const {
139 return fp_spill_mask_;
140 }
141
Ian Rogers96faf5b2013-08-09 22:05:32 -0700142 const std::vector<uint8_t>& GetMappingTable() const {
Mathieu Chartier193bad92013-08-29 18:46:00 -0700143 DCHECK(mapping_table_ != nullptr);
144 return *mapping_table_;
Ian Rogers0c7abda2012-09-19 13:33:42 -0700145 }
146
Ian Rogers96faf5b2013-08-09 22:05:32 -0700147 const std::vector<uint8_t>& GetVmapTable() const {
Mathieu Chartier193bad92013-08-29 18:46:00 -0700148 DCHECK(vmap_table_ != nullptr);
149 return *vmap_table_;
Ian Rogers0c7abda2012-09-19 13:33:42 -0700150 }
151
Ian Rogersa1827042013-04-18 16:36:43 -0700152 const std::vector<uint8_t>& GetGcMap() const {
Mathieu Chartier193bad92013-08-29 18:46:00 -0700153 DCHECK(gc_map_ != nullptr);
154 return *gc_map_;
Ian Rogers0c7abda2012-09-19 13:33:42 -0700155 }
Logan Chien110bcba2012-04-16 19:11:28 +0800156
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700157 private:
Ian Rogersa1827042013-04-18 16:36:43 -0700158 // For quick code, the size of the activation used by the code.
Ian Rogers0c7abda2012-09-19 13:33:42 -0700159 const size_t frame_size_in_bytes_;
Ian Rogersa1827042013-04-18 16:36:43 -0700160 // For quick code, a bit mask describing spilled GPR callee-save registers.
Ian Rogers169c9a72011-11-13 20:13:17 -0800161 const uint32_t core_spill_mask_;
Ian Rogersa1827042013-04-18 16:36:43 -0700162 // For quick code, a bit mask describing spilled FPR callee-save registers.
Ian Rogers169c9a72011-11-13 20:13:17 -0800163 const uint32_t fp_spill_mask_;
Ian Rogers96faf5b2013-08-09 22:05:32 -0700164 // For quick code, a uleb128 encoded map from native PC offset to dex PC aswell as dex PC to
165 // native PC offset. Size prefixed.
Mathieu Chartier193bad92013-08-29 18:46:00 -0700166 std::vector<uint8_t>* mapping_table_;
Ian Rogers96faf5b2013-08-09 22:05:32 -0700167 // For quick code, a uleb128 encoded map from GPR/FPR register to dex register. Size prefixed.
Mathieu Chartier193bad92013-08-29 18:46:00 -0700168 std::vector<uint8_t>* vmap_table_;
Ian Rogersa1827042013-04-18 16:36:43 -0700169 // For quick code, a map keyed by native PC indices to bitmaps describing what dalvik registers
170 // are live. For portable code, the key is a dalvik PC.
Mathieu Chartier193bad92013-08-29 18:46:00 -0700171 std::vector<uint8_t>* gc_map_;
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700172};
173
Brian Carlstrom3320cf42011-10-04 14:58:28 -0700174} // namespace art
175
Mathieu Chartier193bad92013-08-29 18:46:00 -0700176#endif // ART_COMPILER_COMPILED_METHOD_H_