[llvm] r293950 - [lto] add getLinkerOpts()
Kostya Serebryany via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 2 17:56:26 PST 2017
This makes the ubsan bot sad:
http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/2511/steps/check-llvm%20ubsan/logs/stdio
/mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/include/llvm/Target/TargetLoweringObjectFile.h:63:40:
runtime error: reference binding to null pointer of type
'llvm::Mangler'
#0 0xffac44 in llvm::TargetLoweringObjectFile::getMangler() const
/mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/include/llvm/Target/TargetLoweringObjectFile.h:63:33
#1 0x232ae80 in
llvm::TargetLoweringObjectFileCOFF::emitLinkerFlagsForGlobal(llvm::raw_ostream&,
llvm::GlobalValue const*) const
/mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp:1156:59
#2 0x18a63a5 in llvm::LTOModule::parseMetadata()
/mnt/b/sanitizer-buildbot3/sanitizer-x86_64-linux-fast/build/llvm/lib/LTO/LTOModule.cpp:654:36
please fix or revert ASAP.
--kcc
On Thu, Feb 2, 2017 at 3:00 PM, Bob Haarman via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: inglorion
> Date: Thu Feb 2 17:00:49 2017
> New Revision: 293950
>
> URL: http://llvm.org/viewvc/llvm-project?rev=293950&view=rev
> Log:
> [lto] add getLinkerOpts()
>
> Summary: Some compilers, including MSVC and Clang, allow linker options to
> be specified in source files. In the legacy LTO API, there is a
> getLinkerOpts() method that returns linker options for the bitcode module
> being processed. This change adds that method to the new API, so that the
> COFF linker can get the right linker options when using the new LTO API.
>
> Reviewers: pcc, ruiu, mehdi_amini, tejohnson
>
> Reviewed By: pcc
>
> Differential Revision: https://reviews.llvm.org/D29207
>
>
> Modified:
> llvm/trunk/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
> llvm/trunk/include/llvm/LTO/LTO.h
> llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
> llvm/trunk/lib/LTO/LTO.cpp
>
> Modified: llvm/trunk/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/
> TargetLoweringObjectFileImpl.h?rev=293950&r1=293949&r2=293950&view=diff
> ============================================================
> ==================
> --- llvm/trunk/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
> (original)
> +++ llvm/trunk/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h Thu
> Feb 2 17:00:49 2017
> @@ -171,6 +171,9 @@ public:
> const GlobalValue *GV) const override;
> };
>
> +void emitLinkerFlagsForGlobalCOFF(raw_ostream &OS, const GlobalValue *GV,
> + const Triple &TT, Mangler &Mangler);
> +
> } // end namespace llvm
>
> #endif
>
> Modified: llvm/trunk/include/llvm/LTO/LTO.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/
> llvm/LTO/LTO.h?rev=293950&r1=293949&r2=293950&view=diff
> ============================================================
> ==================
> --- llvm/trunk/include/llvm/LTO/LTO.h (original)
> +++ llvm/trunk/include/llvm/LTO/LTO.h Thu Feb 2 17:00:49 2017
> @@ -25,6 +25,7 @@
> #include "llvm/LTO/Config.h"
> #include "llvm/Linker/IRMover.h"
> #include "llvm/Object/IRObjectFile.h"
> +#include "llvm/Support/Error.h"
> #include "llvm/Support/thread.h"
> #include "llvm/Target/TargetOptions.h"
> #include "llvm/Transforms/IPO/FunctionImport.h"
> @@ -226,6 +227,9 @@ public:
> symbol_iterator(SymTab.symbols().end(), SymTab, this));
> }
>
> + /// Returns linker options specified in the input file.
> + Expected<std::string> getLinkerOpts();
> +
> /// Returns the path to the InputFile.
> StringRef getName() const;
>
>
> Modified: llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/
> TargetLoweringObjectFileImpl.cpp?rev=293950&r1=293949&r2=293950&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp (original)
> +++ llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp Thu Feb 2
> 17:00:49 2017
> @@ -919,6 +919,37 @@ static int getSelectionForCOFF(const Glo
> return 0;
> }
>
> +void llvm::emitLinkerFlagsForGlobalCOFF(raw_ostream &OS, const
> GlobalValue *GV,
> + const Triple &TT, Mangler
> &Mangler) {
> + if (!GV->hasDLLExportStorageClass() || GV->isDeclaration())
> + return;
> +
> + if (TT.isKnownWindowsMSVCEnvironment())
> + OS << " /EXPORT:";
> + else
> + OS << " -export:";
> +
> + if (TT.isWindowsGNUEnvironment() || TT.isWindowsCygwinEnvironment()) {
> + std::string Flag;
> + raw_string_ostream FlagOS(Flag);
> + Mangler.getNameWithPrefix(FlagOS, GV, false);
> + FlagOS.flush();
> + if (Flag[0] == GV->getParent()->getDataLayout().getGlobalPrefix())
> + OS << Flag.substr(1);
> + else
> + OS << Flag;
> + } else {
> + Mangler.getNameWithPrefix(OS, GV, false);
> + }
> +
> + if (!GV->getValueType()->isFunctionTy()) {
> + if (TT.isKnownWindowsMSVCEnvironment())
> + OS << ",DATA";
> + else
> + OS << ",data";
> + }
> +}
> +
> MCSection *TargetLoweringObjectFileCOFF::getExplicitSectionGlobal(
> const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM)
> const {
> int Selection = 0;
> @@ -1122,33 +1153,5 @@ MCSection *TargetLoweringObjectFileCOFF:
>
> void TargetLoweringObjectFileCOFF::emitLinkerFlagsForGlobal(
> raw_ostream &OS, const GlobalValue *GV) const {
> - if (!GV->hasDLLExportStorageClass() || GV->isDeclaration())
> - return;
> -
> - const Triple &TT = getTargetTriple();
> -
> - if (TT.isKnownWindowsMSVCEnvironment())
> - OS << " /EXPORT:";
> - else
> - OS << " -export:";
> -
> - if (TT.isWindowsGNUEnvironment() || TT.isWindowsCygwinEnvironment()) {
> - std::string Flag;
> - raw_string_ostream FlagOS(Flag);
> - getMangler().getNameWithPrefix(FlagOS, GV, false);
> - FlagOS.flush();
> - if (Flag[0] == GV->getParent()->getDataLayout().getGlobalPrefix())
> - OS << Flag.substr(1);
> - else
> - OS << Flag;
> - } else {
> - getMangler().getNameWithPrefix(OS, GV, false);
> - }
> -
> - if (!GV->getValueType()->isFunctionTy()) {
> - if (TT.isKnownWindowsMSVCEnvironment())
> - OS << ",DATA";
> - else
> - OS << ",data";
> - }
> + emitLinkerFlagsForGlobalCOFF(OS, GV, getTargetTriple(), getMangler());
> }
>
> Modified: llvm/trunk/lib/LTO/LTO.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/LTO/
> LTO.cpp?rev=293950&r1=293949&r2=293950&view=diff
> ============================================================
> ==================
> --- llvm/trunk/lib/LTO/LTO.cpp (original)
> +++ llvm/trunk/lib/LTO/LTO.cpp Thu Feb 2 17:00:49 2017
> @@ -17,12 +17,16 @@
> #include "llvm/Bitcode/BitcodeReader.h"
> #include "llvm/Bitcode/BitcodeWriter.h"
> #include "llvm/CodeGen/Analysis.h"
> +#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
> #include "llvm/IR/AutoUpgrade.h"
> #include "llvm/IR/DiagnosticPrinter.h"
> #include "llvm/IR/LegacyPassManager.h"
> +#include "llvm/IR/Mangler.h"
> +#include "llvm/IR/Metadata.h"
> #include "llvm/LTO/LTOBackend.h"
> #include "llvm/Linker/IRMover.h"
> #include "llvm/Object/ModuleSummaryIndexObjectFile.h"
> +#include "llvm/Support/Error.h"
> #include "llvm/Support/ManagedStatic.h"
> #include "llvm/Support/MemoryBuffer.h"
> #include "llvm/Support/Path.h"
> @@ -291,6 +295,32 @@ Expected<int> InputFile::Symbol::getComd
> return -1;
> }
>
> +Expected<std::string> InputFile::getLinkerOpts() {
> + std::string LinkerOpts;
> + raw_string_ostream LOS(LinkerOpts);
> + // Extract linker options from module metadata.
> + for (InputModule &Mod : Mods) {
> + std::unique_ptr<Module> &M = Mod.Mod;
> + if (auto E = M->materializeMetadata())
> + return std::move(E);
> + if (Metadata *Val = M->getModuleFlag("Linker Options")) {
> + MDNode *LinkerOptions = cast<MDNode>(Val);
> + for (const MDOperand &MDOptions : LinkerOptions->operands())
> + for (const MDOperand &MDOption : cast<MDNode>(MDOptions)->
> operands())
> + LOS << " " << cast<MDString>(MDOption)->getString();
> + }
> + }
> +
> + // Synthesize export flags for symbols with dllexport storage.
> + const Triple TT(Mods[0].Mod->getTargetTriple());
> + Mangler M;
> + for (const ModuleSymbolTable::Symbol &Sym : SymTab.symbols())
> + if (auto *GV = Sym.dyn_cast<GlobalValue*>())
> + emitLinkerFlagsForGlobalCOFF(LOS, GV, TT, M);
> + LOS.flush();
> + return LinkerOpts;
> +}
> +
> StringRef InputFile::getName() const {
> return Mods[0].BM.getModuleIdentifier();
> }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170202/d6402eee/attachment.html>
More information about the llvm-commits
mailing list