r297649 - [Linker] Provide callback for internalization
Jonas Devlieghere via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 13 11:08:12 PDT 2017
Author: jdevlieghere
Date: Mon Mar 13 13:08:11 2017
New Revision: 297649
URL: http://llvm.org/viewvc/llvm-project?rev=297649&view=rev
Log:
[Linker] Provide callback for internalization
Differential Revision: https://reviews.llvm.org/D30738
Modified:
cfe/trunk/include/clang/CodeGen/CodeGenAction.h
cfe/trunk/include/clang/Frontend/CodeGenOptions.h
cfe/trunk/lib/CodeGen/CodeGenAction.cpp
cfe/trunk/lib/Frontend/CompilerInvocation.cpp
Modified: cfe/trunk/include/clang/CodeGen/CodeGenAction.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/CodeGen/CodeGenAction.h?rev=297649&r1=297648&r2=297649&view=diff
==============================================================================
--- cfe/trunk/include/clang/CodeGen/CodeGenAction.h (original)
+++ cfe/trunk/include/clang/CodeGen/CodeGenAction.h Mon Mar 13 13:08:11 2017
@@ -36,6 +36,9 @@ private:
/// function ourselves.
bool PropagateAttrs;
+ /// If true, we use LLVM module internalizer.
+ bool Internalize;
+
/// Bitwise combination of llvm::LinkerFlags used when we link the module.
unsigned LinkFlags;
};
Modified: cfe/trunk/include/clang/Frontend/CodeGenOptions.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/CodeGenOptions.h?rev=297649&r1=297648&r2=297649&view=diff
==============================================================================
--- cfe/trunk/include/clang/Frontend/CodeGenOptions.h (original)
+++ cfe/trunk/include/clang/Frontend/CodeGenOptions.h Mon Mar 13 13:08:11 2017
@@ -137,6 +137,8 @@ public:
/// our CodeGenOptions, much as we set attrs on functions that we generate
/// ourselves.
bool PropagateAttrs = false;
+ /// If true, we use LLVM module internalizer.
+ bool Internalize = false;
/// Bitwise combination of llvm::Linker::Flags, passed to the LLVM linker.
unsigned LinkFlags = 0;
};
Modified: cfe/trunk/lib/CodeGen/CodeGenAction.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenAction.cpp?rev=297649&r1=297648&r2=297649&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenAction.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenAction.cpp Mon Mar 13 13:08:11 2017
@@ -28,6 +28,7 @@
#include "llvm/IR/DebugInfo.h"
#include "llvm/IR/DiagnosticInfo.h"
#include "llvm/IR/DiagnosticPrinter.h"
+#include "llvm/IR/GlobalValue.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/IRReader/IRReader.h"
@@ -38,6 +39,8 @@
#include "llvm/Support/Timer.h"
#include "llvm/Support/ToolOutputFile.h"
#include "llvm/Support/YAMLTraits.h"
+#include "llvm/Transforms/IPO/Internalize.h"
+
#include <memory>
using namespace clang;
using namespace llvm;
@@ -168,8 +171,22 @@ namespace clang {
Gen->CGM().AddDefaultFnAttrs(F);
CurLinkModule = LM.Module.get();
- if (Linker::linkModules(*getModule(), std::move(LM.Module),
- LM.LinkFlags))
+
+ bool Err;
+ if (LM.Internalize) {
+ Err = Linker::linkModules(
+ *getModule(), std::move(LM.Module), LM.LinkFlags,
+ [](llvm::Module &M, const llvm::StringSet<> &GVS) {
+ internalizeModule(M, [&M, &GVS](const llvm::GlobalValue &GV) {
+ return !GV.hasName() || (GVS.count(GV.getName()) == 0);
+ });
+ });
+ } else {
+ Err = Linker::linkModules(*getModule(), std::move(LM.Module),
+ LM.LinkFlags);
+ }
+
+ if (Err)
return true;
}
return false; // success
@@ -319,7 +336,7 @@ namespace clang {
void OptimizationFailureHandler(
const llvm::DiagnosticInfoOptimizationFailure &D);
};
-
+
void BackendConsumer::anchor() {}
}
@@ -388,7 +405,7 @@ void BackendConsumer::InlineAsmDiagHandl
// code.
if (LocCookie.isValid()) {
Diags.Report(LocCookie, DiagID).AddString(Message);
-
+
if (D.getLoc().isValid()) {
DiagnosticBuilder B = Diags.Report(Loc, diag::note_fe_inline_asm_here);
// Convert the SMDiagnostic ranges into SourceRange and attach them
@@ -401,7 +418,7 @@ void BackendConsumer::InlineAsmDiagHandl
}
return;
}
-
+
// Otherwise, report the backend issue as occurring in the generated .s file.
// If Loc is invalid, we still need to report the issue, it just gets no
// location info.
@@ -815,8 +832,8 @@ CodeGenAction::CreateASTConsumer(Compile
LinkModules.clear();
return nullptr;
}
- LinkModules.push_back(
- {std::move(ModuleOrErr.get()), F.PropagateAttrs, F.LinkFlags});
+ LinkModules.push_back({std::move(ModuleOrErr.get()), F.PropagateAttrs,
+ F.Internalize, F.LinkFlags});
}
CoverageSourceInfo *CoverageInfo = nullptr;
Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=297649&r1=297648&r2=297649&view=diff
==============================================================================
--- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)
+++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Mon Mar 13 13:08:11 2017
@@ -727,11 +727,11 @@ static bool ParseCodeGenArgs(CodeGenOpti
CodeGenOptions::BitcodeFileToLink F;
F.Filename = A->getValue();
if (A->getOption().matches(OPT_mlink_cuda_bitcode)) {
- F.LinkFlags = llvm::Linker::Flags::LinkOnlyNeeded |
- llvm::Linker::Flags::InternalizeLinkedSymbols;
+ F.LinkFlags = llvm::Linker::Flags::LinkOnlyNeeded;
// When linking CUDA bitcode, propagate function attributes so that
// e.g. libdevice gets fast-math attrs if we're building with fast-math.
F.PropagateAttrs = true;
+ F.Internalize = true;
}
Opts.LinkBitcodeFiles.push_back(F);
}
More information about the cfe-commits
mailing list