blob: c48f2f384b7d9bc01067c88a275f5018311df7d9 [file] [log] [blame]
//===-- Resolver.h - Class resolver for Java classes ------------*- 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 declaration of a Java class resolver. This
// object creates Class objects out of loaded ClassFiles.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_JAVA_RESOLVER_H
#define LLVM_JAVA_RESOLVER_H
#include "VMClass.h"
#include <llvm/Java/Bytecode.h>
#include <llvm/Module.h>
#include <llvm/Type.h>
#include <map>
#include <string>
namespace llvm { namespace Java {
class Resolver {
Module* module_;
typedef std::map<std::string, VMClass> ClassMap;
ClassMap classMap_;
unsigned nextInterfaceIndex_;
const Type* objectBaseLayoutType_;
const Type* objectBaseType_;
const Type* typeInfoType_;
const Type* classRecordType_;
const Type* classRecordPtrType_;
const VMClass* getClassForDesc(const std::string& descriptor);
const Type* getTypeHelper(const std::string&,
unsigned& i,
bool memberMethod = false) const;
ClassMap::iterator insertClass(ClassMap::iterator i, const VMClass& clazz) {
return classMap_.insert(i, std::make_pair(clazz.getDescriptor(), clazz));
}
friend class VMClass;
public:
static std::string canonicalizeClassName(const std::string& className) {
if (className[0] == '[')
return className;
else
return 'L' + className + ';';
}
Resolver(Module* module);
const Type* getObjectBaseLayoutType() const {return objectBaseLayoutType_; }
const Type* getObjectBaseType() const { return objectBaseType_; }
const Type* getTypeInfoType() const { return typeInfoType_; }
const Type* getClassRecordType() const { return classRecordType_; }
const Type* getClassRecordPtrType() const { return classRecordPtrType_; }
const Type* getType(const std::string& descriptor,
bool memberMethod = false) const;
const Type* getStorageType(const Type* type) const;
inline bool isTwoSlotType(const Type* type) const {
return type == Type::LongTy || type == Type::DoubleTy;
}
inline bool isOneSlotType(const Type* type) const {
return !isTwoSlotType(type);
}
const VMClass* getClass(const std::string& className) {
return getClassForDesc(canonicalizeClassName(className));
}
const VMClass* getClass(JType type);
const VMClass* getArrayClass(const VMClass* clazz) {
return getClassForDesc('[' + clazz->getDescriptor());
}
unsigned getNextInterfaceIndex() { return nextInterfaceIndex_++; }
Module* getModule() { return module_; }
void emitClassRecordsArray() const;
};
} } // namespace llvm::Java
#endif//LLVM_JAVA_RESOLVER_H