[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