#define LTO_MODULE_H
#include "llvm/Module.h"
-#include "llvm/GlobalValue.h"
-#include "llvm/Constants.h"
-#include "llvm/Support/Mangler.h"
+#include "llvm/ADT/OwningPtr.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/ADT/StringMap.h"
#include "llvm-c/lto.h"
#include <vector>
+#include <string>
+
+
+// forward references to llvm classes
+namespace llvm {
+ class Mangler;
+ class MemoryBuffer;
+ class GlobalValue;
+ class Value;
+ class Function;
+}
//
static LTOModule* makeLTOModule(const char* path, std::string& errMsg);
static LTOModule* makeLTOModule(const void* mem, size_t length,
std::string& errMsg);
- ~LTOModule();
const char* getTargetTriple();
uint32_t getSymbolCount();
lto_symbol_attributes getSymbolAttributes(uint32_t index);
const char* getSymbolName(uint32_t index);
- llvm::Module * getLLVVMModule() { return _module; }
- bool targetSupported() { return (_target != NULL); }
+ llvm::Module * getLLVVMModule() { return _module.get(); }
private:
LTOModule(llvm::Module* m, llvm::TargetMachine* t);
+ void lazyParseSymbols();
void addDefinedSymbol(llvm::GlobalValue* def,
llvm::Mangler& mangler,
bool isFunction);
- void addUndefinedSymbol(const char* name);
+ void addPotentialUndefinedSymbol(llvm::GlobalValue* decl,
+ llvm::Mangler &mangler);
void findExternalRefs(llvm::Value* value,
llvm::Mangler& mangler);
+ void addDefinedFunctionSymbol(llvm::Function* f,
+ llvm::Mangler &mangler);
+ void addDefinedDataSymbol(llvm::GlobalValue* v,
+ llvm::Mangler &mangler);
+ static bool isTargetMatch(llvm::MemoryBuffer* memBuffer,
+ const char* triplePrefix);
+ static LTOModule* makeLTOModule(llvm::MemoryBuffer* buffer,
+ std::string& errMsg);
+ static llvm::MemoryBuffer* makeBuffer(const void* mem, size_t length);
+
typedef llvm::StringMap<uint8_t> StringSet;
struct NameAndAttributes {
lto_symbol_attributes attributes;
};
- llvm::Module * _module;
- llvm::TargetMachine * _target;
- bool _symbolsParsed;
- std::vector<NameAndAttributes> _symbols;
- StringSet _defines; // only needed to disambiguate tentative definitions
- StringSet _undefines; // only needed to disambiguate tentative definitions
+ llvm::OwningPtr<llvm::Module> _module;
+ llvm::OwningPtr<llvm::TargetMachine> _target;
+ bool _symbolsParsed;
+ std::vector<NameAndAttributes> _symbols;
+ // _defines and _undefines only needed to disambiguate tentative definitions
+ StringSet _defines;
+ StringSet _undefines;
};
+extern std::string getFeatureString(const char *TargetTriple);
+
#endif // LTO_MODULE_H