* @{
*/
-#define LTO_API_VERSION 7
+#define LTO_API_VERSION 8
/**
* \since prior to LTO_API_VERSION=3
extern lto_symbol_attributes
lto_module_get_symbol_attribute(lto_module_t mod, unsigned int index);
+
+/**
+ * Returns the number of dependent libraries in the object module.
+ *
+ * \since LTO_API_VERSION=8
+ */
+extern unsigned int
+lto_module_get_num_deplibs(lto_module_t mod);
+
+
+/**
+ * Returns the ith dependent library in the module.
+ *
+ * \since LTO_API_VERSION=8
+ */
+extern const char*
+lto_module_get_deplib(lto_module_t mod, unsigned int index);
+
+
+/**
+ * Returns the number of linker options in the object module.
+ *
+ * \since LTO_API_VERSION=8
+ */
+extern unsigned int
+lto_module_get_num_linkeropts(lto_module_t mod);
+
+
+/**
+ * Returns the ith linker option in the module.
+ *
+ * \since LTO_API_VERSION=8
+ */
+extern const char*
+lto_module_get_linkeropt(lto_module_t mod, unsigned int index);
+
+
/**
* Diagnostic severity.
*
public:
virtual ~TargetLoweringObjectFileMachO() {}
+ /// getDepLibFromLinkerOpt - Extract the dependent library name from a linker
+ /// option string. Returns StringRef() if the option does not specify a library.
+ virtual StringRef getDepLibFromLinkerOpt(StringRef LinkerOption) const;
+
/// emitModuleFlags - Emit the module flags that specify the garbage
/// collection information.
virtual void emitModuleFlags(MCStreamer &Streamer,
SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
Mangler *Mang, const TargetMachine &TM) const;
+ /// getDepLibFromLinkerOpt - Extract the dependent library name from a linker
+ /// option string. Returns StringRef() if the option does not specify a library.
+ virtual StringRef getDepLibFromLinkerOpt(StringRef LinkerOption) const;
+
/// emitModuleFlags - Emit Obj-C garbage collection and linker options. Only
/// linker option emission is implemented for COFF.
virtual void emitModuleFlags(MCStreamer &Streamer,
llvm::OwningPtr<llvm::Module> _module;
llvm::OwningPtr<llvm::TargetMachine> _target;
llvm::MCObjectFileInfo ObjFileInfo;
+ StringSet _linkeropt_strings;
+ std::vector<const char *> _deplibs;
+ std::vector<const char *> _linkeropts;
std::vector<NameAndAttributes> _symbols;
// _defines and _undefines only needed to disambiguate tentative definitions
return NULL;
}
+ /// getDependentLibraryCount - Get the number of dependent libraries
+ uint32_t getDependentLibraryCount() {
+ return _deplibs.size();
+ }
+
+ /// getDependentLibrary - Get the dependent library at the specified index.
+ const char *getDependentLibrary(uint32_t index) {
+ if (index < _deplibs.size())
+ return _deplibs[index];
+ return NULL;
+ }
+
+ /// getLinkerOptCount - Get the number of linker options
+ uint32_t getLinkerOptCount() {
+ return _linkeropts.size();
+ }
+
+ /// getLinkerOpt - Get the linker option at the specified index.
+ const char *getLinkerOpt(uint32_t index) {
+ if (index < _linkeropts.size())
+ return _linkeropts[index];
+ return NULL;
+ }
+
/// getLLVVMModule - Return the Module.
llvm::Module *getLLVVMModule() { return _module.get(); }
}
private:
+ /// parseMetadata - Parse metadata from the module
+ // FIXME: it only parses "Linker Options" metadata at the moment
+ void parseMetadata();
+
/// parseSymbols - Parse the symbols from the module and model-level ASM and
/// add them to either the defined or undefined lists.
bool parseSymbols(std::string &errMsg);
const TargetMachine &TM,
const MCSymbol *Sym) const;
+ /// getDepLibFromLinkerOpt - Extract the dependent library name from a linker
+ /// option string. Returns StringRef() if the option does not specify a library.
+ virtual StringRef getDepLibFromLinkerOpt(StringRef LinkerOption) const {
+ return StringRef();
+ }
+
/// emitModuleFlags - Emit the module flags that the platform cares about.
virtual void emitModuleFlags(MCStreamer &,
ArrayRef<Module::ModuleFlagEntry>,
// MachO
//===----------------------------------------------------------------------===//
+/// getDepLibFromLinkerOpt - Extract the dependent library name from a linker
+/// option string. Returns StringRef() if the option does not specify a library.
+StringRef TargetLoweringObjectFileMachO::
+getDepLibFromLinkerOpt(StringRef LinkerOption) const {
+ const char *LibCmd = "-l";
+ if (LinkerOption.startswith(LibCmd))
+ return LinkerOption.substr(strlen(LibCmd));
+ return StringRef();
+}
+
/// emitModuleFlags - Perform code emission for module flags.
void TargetLoweringObjectFileMachO::
emitModuleFlags(MCStreamer &Streamer,
return DataSection;
}
+StringRef TargetLoweringObjectFileCOFF::
+getDepLibFromLinkerOpt(StringRef LinkerOption) const {
+ const char *LibCmd = "/DEFAULTLIB:";
+ if (LinkerOption.startswith(LibCmd))
+ return LinkerOption.substr(strlen(LibCmd));
+ return StringRef();
+}
+
void TargetLoweringObjectFileCOFF::
emitModuleFlags(MCStreamer &Streamer,
ArrayRef<Module::ModuleFlagEntry> ModuleFlags,
#include "llvm/Bitcode/ReaderWriter.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/LLVMContext.h"
+#include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h"
#include "llvm/MC/MCExpr.h"
#include "llvm/MC/MCInst.h"
#include "llvm/Support/TargetRegistry.h"
#include "llvm/Support/TargetSelect.h"
#include "llvm/Support/system_error.h"
+#include "llvm/Target/TargetLowering.h"
+#include "llvm/Target/TargetLoweringObjectFile.h"
#include "llvm/Target/TargetRegisterInfo.h"
#include "llvm/Transforms/Utils/GlobalStatus.h"
using namespace llvm;
return NULL;
}
+ Ret->parseMetadata();
+
return Ret;
}
return false;
}
+
+/// parseMetadata - Parse metadata from the module
+void LTOModule::parseMetadata() {
+ // Linker Options
+ if (Value *Val = _module->getModuleFlag("Linker Options")) {
+ MDNode *LinkerOptions = cast<MDNode>(Val);
+ for (unsigned i = 0, e = LinkerOptions->getNumOperands(); i != e; ++i) {
+ MDNode *MDOptions = cast<MDNode>(LinkerOptions->getOperand(i));
+ for (unsigned ii = 0, ie = MDOptions->getNumOperands(); ii != ie; ++ii) {
+ MDString *MDOption = cast<MDString>(MDOptions->getOperand(ii));
+ StringRef Op = _linkeropt_strings.
+ GetOrCreateValue(MDOption->getString()).getKey();
+ StringRef DepLibName = _target->getTargetLowering()->
+ getObjFileLowering().getDepLibFromLinkerOpt(Op);
+ if (!DepLibName.empty())
+ _deplibs.push_back(DepLibName.data());
+ else if (!Op.empty())
+ _linkeropts.push_back(Op.data());
+ }
+ }
+ }
+
+ // Add other interesting metadata here.
+}
return mod->getSymbolAttributes(index);
}
+/// lto_module_get_num_deplibs - Returns the number of dependent libraries in
+/// the object module.
+unsigned int lto_module_get_num_deplibs(lto_module_t mod) {
+ return mod->getDependentLibraryCount();
+}
+
+/// lto_module_get_deplib - Returns the ith dependent library in the module.
+const char* lto_module_get_deplib(lto_module_t mod, unsigned int index) {
+ return mod->getDependentLibrary(index);
+}
+
+/// lto_module_get_num_linkeropts - Returns the number of linker options in the
+/// object module.
+unsigned int lto_module_get_num_linkeropts(lto_module_t mod) {
+ return mod->getLinkerOptCount();
+}
+
+/// lto_module_get_linkeropt - Returns the ith linker option in the module.
+const char* lto_module_get_linkeropt(lto_module_t mod, unsigned int index) {
+ return mod->getLinkerOpt(index);
+}
+
/// Set a diagnostic handler.
void lto_codegen_set_diagnostic_handler(lto_code_gen_t cg,
lto_diagnostic_handler_t diag_handler,
lto_module_create_from_fd
lto_module_create_from_fd_at_offset
lto_module_create_from_memory
+lto_module_get_deplib
+lto_module_get_linkeropt
+lto_module_get_num_deplibs
+lto_module_get_num_linkeropts
lto_module_get_num_symbols
lto_module_get_symbol_attribute
lto_module_get_symbol_name