Skip to content

Commit

Permalink
Adding new LTO APIs to parse metadata nodes and extract linker option…
Browse files Browse the repository at this point in the history
…s and

dependent libraries from a bitcode module.

Differential Revision: http://llvm-reviews.chandlerc.com/D2343

llvm-svn: 199759
  • Loading branch information
Yunzhong Gao authored and Yunzhong Gao committed Jan 21, 2014
1 parent cb6e125 commit a88d7ab
Show file tree
Hide file tree
Showing 8 changed files with 156 additions and 1 deletion.
39 changes: 38 additions & 1 deletion llvm/include/llvm-c/lto.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ typedef bool lto_bool_t;
* @{
*/

#define LTO_API_VERSION 7
#define LTO_API_VERSION 8

/**
* \since prior to LTO_API_VERSION=3
Expand Down Expand Up @@ -246,6 +246,43 @@ lto_module_get_symbol_name(lto_module_t mod, unsigned int index);
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.
*
Expand Down
8 changes: 8 additions & 0 deletions llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,10 @@ class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile {
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,
Expand Down Expand Up @@ -129,6 +133,10 @@ class TargetLoweringObjectFileCOFF : public TargetLoweringObjectFile {
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,
Expand Down
31 changes: 31 additions & 0 deletions llvm/include/llvm/LTO/LTOModule.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ struct LTOModule {
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
Expand Down Expand Up @@ -129,6 +132,30 @@ struct LTOModule {
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(); }

Expand All @@ -138,6 +165,10 @@ struct LTOModule {
}

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);
Expand Down
6 changes: 6 additions & 0 deletions llvm/include/llvm/Target/TargetLoweringObjectFile.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,12 @@ class TargetLoweringObjectFile : public MCObjectFileInfo {
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>,
Expand Down
18 changes: 18 additions & 0 deletions llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,16 @@ TargetLoweringObjectFileELF::InitializeELF(bool UseInitArray_) {
// 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,
Expand Down Expand Up @@ -774,6 +784,14 @@ SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
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,
Expand Down
29 changes: 29 additions & 0 deletions llvm/lib/LTO/LTOModule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#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"
Expand All @@ -37,6 +38,8 @@
#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;
Expand Down Expand Up @@ -177,6 +180,8 @@ LTOModule *LTOModule::makeLTOModule(MemoryBuffer *buffer,
return NULL;
}

Ret->parseMetadata();

return Ret;
}

Expand Down Expand Up @@ -798,3 +803,27 @@ bool LTOModule::parseSymbols(std::string &errMsg) {

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.
}
22 changes: 22 additions & 0 deletions llvm/tools/lto/lto.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,28 @@ lto_symbol_attributes lto_module_get_symbol_attribute(lto_module_t mod,
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,
Expand Down
4 changes: 4 additions & 0 deletions llvm/tools/lto/lto.exports
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ lto_module_create
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
Expand Down

0 comments on commit a88d7ab

Please sign in to comment.