Bug fix & add internalize pass to LTO.
diff --git a/bcc.cpp b/bcc.cpp
index 667c3e3..0d00278 100644
--- a/bcc.cpp
+++ b/bcc.cpp
@@ -2322,8 +2322,6 @@
llvm::LLVMContext *mContext;
llvm::Module *mModule;
- bool mTypeInformationPrepared;
- std::vector<const llvm::Type*> mTypes;
bool mHasLinked;
public:
@@ -2473,10 +2471,53 @@
// Get target data from Module
TD = new llvm::TargetData(mModule);
+ // Load named metadata
+ ExportVarMetadata = mModule->getNamedMetadata(ExportVarMetadataName);
+ ExportFuncMetadata = mModule->getNamedMetadata(ExportFuncMetadataName);
+ PragmaMetadata = mModule->getNamedMetadata(PragmaMetadataName);
+
// Create LTO passes and run them on the mModule
if (mHasLinked) {
+ llvm::TimePassesIsEnabled = true;
llvm::PassManager LTOPasses;
- LTOPasses.add(TD);
+ LTOPasses.add(new llvm::TargetData(*TD));
+
+ std::vector<const char*> ExportSymbols;
+
+ // A workaround for getting export variable and function name. Will refine
+ // it soon.
+ if (ExportVarMetadata) {
+ for (int i = 0, e = ExportVarMetadata->getNumOperands(); i != e; i++) {
+ llvm::MDNode *ExportVar = ExportVarMetadata->getOperand(i);
+ if (ExportVar != NULL && ExportVar->getNumOperands() > 1) {
+ llvm::Value *ExportVarNameMDS = ExportVar->getOperand(0);
+ if (ExportVarNameMDS->getValueID() == llvm::Value::MDStringVal) {
+ llvm::StringRef ExportVarName =
+ static_cast<llvm::MDString*>(ExportVarNameMDS)->getString();
+ ExportSymbols.push_back(ExportVarName.data());
+ }
+ }
+ }
+ }
+
+ if (ExportFuncMetadata) {
+ for (int i = 0, e = ExportFuncMetadata->getNumOperands(); i != e; i++) {
+ llvm::MDNode *ExportFunc = ExportFuncMetadata->getOperand(i);
+ if (ExportFunc != NULL && ExportFunc->getNumOperands() > 0) {
+ llvm::Value *ExportFuncNameMDS = ExportFunc->getOperand(0);
+ if (ExportFuncNameMDS->getValueID() == llvm::Value::MDStringVal) {
+ llvm::StringRef ExportFuncName =
+ static_cast<llvm::MDString*>(ExportFuncNameMDS)->getString();
+ ExportSymbols.push_back(ExportFuncName.data());
+ }
+ }
+ }
+ }
+ // root() and init() are born to be exported
+ ExportSymbols.push_back("root");
+ ExportSymbols.push_back("init");
+
+ LTOPasses.add(llvm::createInternalizePass(ExportSymbols));
llvm::createStandardLTOPasses(<OPasses,
/* Internalize = */false,
@@ -2509,7 +2550,6 @@
CodeGenPasses->doFinalization();
// Copy the global address mapping from code emitter and remapping
- ExportVarMetadata = mModule->getNamedMetadata(ExportVarMetadataName);
if (ExportVarMetadata) {
for (int i = 0, e = ExportVarMetadata->getNumOperands(); i != e; i++) {
llvm::MDNode *ExportVar = ExportVarMetadata->getOperand(i);
@@ -2542,7 +2582,6 @@
"Number of slots doesn't match the number of export variables!");
}
- ExportFuncMetadata = mModule->getNamedMetadata(ExportFuncMetadataName);
if (ExportFuncMetadata) {
for (int i = 0, e = ExportFuncMetadata->getNumOperands(); i != e; i++) {
llvm::MDNode *ExportFunc = ExportFuncMetadata->getOperand(i);
@@ -2563,7 +2602,6 @@
// Finally, read pragma information from the metadata node of the @Module if
// any.
- PragmaMetadata = mModule->getNamedMetadata(PragmaMetadataName);
if (PragmaMetadata)
for (int i = 0, e = PragmaMetadata->getNumOperands(); i != e; i++) {
llvm::MDNode *Pragma = PragmaMetadata->getOperand(i);
@@ -2712,10 +2750,6 @@
return mModule;
}
- inline const std::vector<const llvm::Type*> &getTypes() const {
- return mTypes;
- }
-
~Compiler() {
delete mModule;
// llvm::llvm_shutdown();