#ifndef LLVM_OBJCMETADATA_OBJCBITCODE_H
#define LLVM_OBJCMETADATA_OBJCBITCODE_H
#include <llvm/ADT/SmallVector.h>
#include <llvm/ADT/Triple.h>
#include <llvm/IR/Constants.h>
#include <llvm/IR/GlobalValue.h>
#include <llvm/IR/Module.h>
#include <llvm/ObjCMetadata/ObjCMetadata.h>
namespace llvm {
class BitcodeMetadata : public ObjCMetaDataReader {
public:
BitcodeMetadata(Module *M);
bool isObjC1() const override;
bool isObjC2() const override;
const Module *getOwningModule() const {
return OwningModule;
}
Expected<ObjCClassList> classes() const override;
Expected<ObjCClass> getObjCClassFromRef(ObjCClassRef Ref) const override;
bool isObjCClassExternal(ObjCClassRef Ref) const override;
Expected<ObjCCategoryList> categories() const override;
Expected<ObjCCategory>
getObjCCategoryFromRef(ObjCCategoryRef Ref) const override;
Expected<ObjCProtocolList> protocols() const override;
Expected<ObjCProtocol>
getObjCProtocolFromRef(ObjCProtocolRef Ref) const override;
Expected<StringRef> getObjCClassName(ObjCClass ClassRef) const override;
Expected<StringRef> getObjCSuperClassName(ObjCClass Data) const override;
Expected<bool> isObjCClassSwift(ObjCClass Data) const override;
Expected<bool> isObjCClassMetaClass(ObjCClass Data) const override;
Expected<ObjCPropertyList>
materializePropertyList(ObjCClass Data) const override;
Expected<ObjCMethodList>
materializeInstanceMethodList(ObjCClass Data) const override;
Expected<ObjCMethodList>
materializeClassMethodList(ObjCClass Data) const override;
Expected<StringRef> getObjCCategoryName(ObjCCategory Data) const override;
Expected<StringRef>
getObjCCategoryBaseClassName(ObjCCategory Data) const override;
Expected<ObjCPropertyList>
materializePropertyList(ObjCCategory Data) const override;
Expected<ObjCMethodList>
materializeInstanceMethodList(ObjCCategory Data) const override;
Expected<ObjCMethodList>
materializeClassMethodList(ObjCCategory Data) const override;
Expected<StringRef> getObjCProtocolName(ObjCProtocol Data) const override;
Expected<ObjCPropertyList>
materializePropertyList(ObjCProtocol Data) const override;
Expected<ObjCMethodList>
materializeInstanceMethodList(ObjCProtocol Data) const override;
Expected<ObjCMethodList>
materializeClassMethodList(ObjCProtocol Data) const override;
Expected<ObjCMethodList>
materializeOptionalInstanceMethodList(ObjCProtocol Data) const override;
Expected<ObjCMethodList>
materializeOptionalClassMethodList(ObjCProtocol Data) const override;
Expected<StringRef> getPropertyName(ObjCProperty Data) const override;
Expected<StringRef> getPropertyAttribute(ObjCProperty Data) const override;
Expected<StringRef> getMethodName(ObjCMethod Data) const override;
Expected<StringRef> getMethodType(ObjCMethod Data) const override;
Expected<ObjCSelectorList> referencedSelectors() const override;
Expected<StringRef> getObjCSelectorName(ObjCSelectorRef Ref) const override;
void getAllPotentiallyDefinedSelectors(StringSet<> &Set) const override;
StringRef getSymbolNameFromRef(ObjCRef Ref) const override;
StringRef guessClassNameBasedOnSymbol(StringRef Sym) const override;
bool is64Bit() const {
return Triple(OwningModule->getTargetTriple()).isArch64Bit();
}
const DataLayout &getDataLayout() const {
return OwningModule->getDataLayout();
}
Expected<ConstantStruct*> getObjC2ClassRO(ObjCClass Data) const;
private:
Module *OwningModule;
};
}
#endif