diff options
| author | 2012-04-16 19:11:28 +0800 | |
|---|---|---|
| committer | 2012-04-16 04:56:13 -0700 | |
| commit | 110bcbafbbc4c27bf31d32732aab06f900c02653 (patch) | |
| tree | c7467d4871b658c06f5ba7c527cb2847ae28913a /src/compiler_llvm/compilation_unit.cc | |
| parent | fd8ea97f64fb6d32cbfe35729b816a22dfa18224 (diff) | |
Update frame size after the bitcode is translated into machine code.
Change-Id: I59923a6cb1a1079d9cfe6d995fe0067ee1c49e80
Diffstat (limited to 'src/compiler_llvm/compilation_unit.cc')
| -rw-r--r-- | src/compiler_llvm/compilation_unit.cc | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/compiler_llvm/compilation_unit.cc b/src/compiler_llvm/compilation_unit.cc index fde023c914..09e193d46b 100644 --- a/src/compiler_llvm/compilation_unit.cc +++ b/src/compiler_llvm/compilation_unit.cc @@ -16,6 +16,7 @@ #include "compilation_unit.h" +#include "compiled_method.h" #include "instruction_set.h" #include "ir_builder.h" #include "logging.h" @@ -34,6 +35,9 @@ #include <llvm/Assembly/PrintModulePass.h> #include <llvm/Bitcode/ReaderWriter.h> #include <llvm/CallGraphSCCPass.h> +#include <llvm/CodeGen/MachineFrameInfo.h> +#include <llvm/CodeGen/MachineFunction.h> +#include <llvm/CodeGen/MachineFunctionPass.h> #include <llvm/DerivedTypes.h> #include <llvm/LLVMContext.h> #include <llvm/Module.h> @@ -57,6 +61,40 @@ #include <string> +namespace { + +class UpdateFrameSizePass : public llvm::MachineFunctionPass { + public: + static char ID; + + UpdateFrameSizePass() : llvm::MachineFunctionPass(ID), cunit_(NULL) { + LOG(FATAL) << "Unexpected instantiation of UpdateFrameSizePass"; + // NOTE: We have to declare this constructor for llvm::RegisterPass, but + // this constructor won't work because we have no information on + // CompilationUnit. Thus, we should place a LOG(FATAL) here. + } + + UpdateFrameSizePass(art::compiler_llvm::CompilationUnit* cunit) + : llvm::MachineFunctionPass(ID), cunit_(cunit) { + } + + virtual bool runOnMachineFunction(llvm::MachineFunction &MF) { + cunit_->UpdateFrameSizeInBytes(MF.getFunction(), + MF.getFrameInfo()->getStackSize()); + return false; + } + + private: + art::compiler_llvm::CompilationUnit* cunit_; +}; + +char UpdateFrameSizePass::ID = 0; + +llvm::RegisterPass<UpdateFrameSizePass> reg_update_frame_size_pass_( + "update-frame-size", "Update frame size pass", false, false); + +} // end anonymous namespace + namespace art { namespace compiler_llvm { @@ -204,6 +242,9 @@ bool CompilationUnit::Materialize() { return false; } + // Add pass to update the frame_size_in_bytes_ + pm.add(new ::UpdateFrameSizePass(this)); + // Run the per-function optimization fpm.doInitialization(); for (llvm::Module::iterator F = module_->begin(), E = module_->end(); @@ -227,5 +268,29 @@ bool CompilationUnit::Materialize() { } +void CompilationUnit::RegisterCompiledMethod(const llvm::Function* func, + CompiledMethod* compiled_method) { + compiled_methods_map_.Put(func, compiled_method); +} + + +void CompilationUnit::UpdateFrameSizeInBytes(const llvm::Function* func, + size_t frame_size_in_bytes) { + SafeMap<const llvm::Function*, CompiledMethod*>::iterator iter = + compiled_methods_map_.find(func); + + if (iter != compiled_methods_map_.end()) { + CompiledMethod* compiled_method = iter->second; + compiled_method->SetFrameSizeInBytes(frame_size_in_bytes); + + if (frame_size_in_bytes > 1728u) { + LOG(WARNING) << "Huge frame size: " << frame_size_in_bytes + << " elf_idx=" << compiled_method->GetElfIndex() + << " elf_func_idx=" << compiled_method->GetElfFuncIndex(); + } + } +} + + } // namespace compiler_llvm } // namespace art |