[llvm] r293950 - [lto] add getLinkerOpts()

Kostya Serebryany via llvm-commits llvm-commits at lists.llvm.org
Fri Feb 3 14:50:44 PST 2017


+pcc
he bot is still red.
Bob or Peter, please fix or revert ASAP.

On Thu, Feb 2, 2017 at 5:56 PM, Kostya Serebryany <kcc at google.com> wrote:

> 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/T
>> argetLoweringObjectFileImpl.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)->opera
>> nds())
>> +          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/20170203/24090b13/attachment.html>


More information about the llvm-commits mailing list