blob: 47307c050f55269b63c814fbece15a19df4aef78 [file] [log] [blame]
//===-- Locals.h - Java locals ----------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file was developed by the LLVM research group and is distributed under
// the University of Illinois Open Source License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file contains the abstraction of Java locals. We model the
// locals as an array of lazily created allocas.
//
//===----------------------------------------------------------------------===//
#include "Locals.h"
#include <llvm/BasicBlock.h>
#include <llvm/DerivedTypes.h>
#include <llvm/Function.h>
#include <llvm/Instructions.h>
#include <llvm/ADT/StringExtras.h>
#include <llvm/Java/Compiler.h>
using namespace llvm;
using namespace llvm::Java;
Locals::Locals(const Resolver* resolver, unsigned maxLocals)
: resolver_(resolver),
locals_(maxLocals)
{
}
void Locals::store(unsigned i, Value* value, BasicBlock* insertAtEnd)
{
const Type* valueTy = value->getType();
const Type* storageTy = resolver_->getStorageType(valueTy);
if (valueTy != storageTy)
value = new CastInst(value, storageTy, "to-storage-type", insertAtEnd);
SlotMap& slotMap = locals_[i];
SlotMap::iterator it = slotMap.find(storageTy);
if (it == slotMap.end()) {
// Insert the alloca at the end of the entry block.
BasicBlock* entry = &insertAtEnd->getParent()->getEntryBlock();
AllocaInst* alloca =
new AllocaInst(storageTy, NULL, "local"+utostr(i), entry);
it = slotMap.insert(it, std::make_pair(storageTy, alloca));
}
new StoreInst(value, it->second, insertAtEnd);
}
llvm::Value* Locals::load(unsigned i, const Type* valueTy,
BasicBlock* insertAtEnd)
{
const Type* storageTy = resolver_->getStorageType(valueTy);
SlotMap& slotMap = locals_[i];
SlotMap::iterator it = slotMap.find(storageTy);
assert(it != slotMap.end() && "Attempt to load a non initialized global!");
Value* value = new LoadInst(it->second, "load", insertAtEnd);
if (valueTy != storageTy)
value = new CastInst(value, valueTy, "from-storage-type", insertAtEnd);
return value;
}