[llvm] r254538 - Fix linking when we copy over only a decl.

Mike Aizatsky via llvm-commits llvm-commits at lists.llvm.org
Wed Dec 2 12:44:47 PST 2015


For some reason this appear to break CFI test on windows bot. Is this a
problem in the change or somewhere else?

http://lab.llvm.org:8011/builders/sanitizer-windows/builds/13706

Command 7: "C:/b/slave/sanitizer-windows/build/./bin/clang.exe"
"-fuse-ld=lld" "-flto" "-fsanitize=cfi" "-o"
"C:\b\slave\sanitizer-windows\build\projects\compiler-rt\test\cfi\Output\anon-namespace.cpp.tmp2"
"C:\b\slave\sanitizer-windows\build\projects\compiler-rt\test\cfi\Output\anon-namespace.cpp.tmp1.o"
"C:\b\slave\sanitizer-windows\build\projects\compiler-rt\test\cfi\Output\anon-namespace.cpp.tmp2.o"

Command 7 Result: 1

Command 7 Output:





Command 7 Stderr:

Alias must point to a definition


i8** @"\01??_7B@?A@@6B at .2"


LLVM ERROR: Broken module found, compilation aborted!


clang.exe: error: linker command failed with exit code 1 (use -v to
see invocation)








On Wed, Dec 2, 2015 at 11:33 AM Rafael Espindola via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: rafael
> Date: Wed Dec  2 13:30:52 2015
> New Revision: 254538
>
> URL: http://llvm.org/viewvc/llvm-project?rev=254538&view=rev
> Log:
> Fix linking when we copy over only a decl.
>
> We were failing to copy the fact that the GV is weak and in the case of
> an alias, producing invalid IR.
>
> Added:
>     llvm/trunk/test/Linker/Inputs/comdat14.ll
>     llvm/trunk/test/Linker/comdat14.ll
> Modified:
>     llvm/trunk/lib/Linker/LinkModules.cpp
>
> Modified: llvm/trunk/lib/Linker/LinkModules.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Linker/LinkModules.cpp?rev=254538&r1=254537&r2=254538&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Linker/LinkModules.cpp (original)
> +++ llvm/trunk/lib/Linker/LinkModules.cpp Wed Dec  2 13:30:52 2015
> @@ -453,7 +453,7 @@ private:
>    /// Handles cloning of a global values from the source module into
>    /// the destination module, including setting the attributes and
> visibility.
>    GlobalValue *copyGlobalValueProto(TypeMapTy &TypeMap, const GlobalValue
> *SGV,
> -                                    const GlobalValue *DGV = nullptr);
> +                                    const GlobalValue *DGV, bool
> ForDefinition);
>
>    /// Check if we should promote the given local value to global scope.
>    bool doPromoteLocalToGlobal(const GlobalValue *SGV);
> @@ -594,14 +594,8 @@ static void forceRenaming(GlobalValue *G
>  void ModuleLinker::copyGVAttributes(GlobalValue *NewGV,
>                                      const GlobalValue *SrcGV) {
>    auto *GA = dyn_cast<GlobalAlias>(SrcGV);
> -  // Check for the special case of converting an alias (definition) to a
> -  // non-alias (declaration). This can happen when we are importing and
> -  // encounter a weak_any alias (weak_any defs may not be imported, see
> -  // comments in ModuleLinker::getLinkage) or an alias whose base object
> is
> -  // being imported as a declaration. In that case copy the attributes
> from the
> -  // base object.
>    if (GA && !dyn_cast<GlobalAlias>(NewGV)) {
> -    assert(isPerformingImport() && !doImportAsDefinition(GA));
> +    // FIXME: this is likelly bogus:
>      NewGV->copyAttributesFrom(GA->getBaseObject());
>    } else
>      NewGV->copyAttributesFrom(SrcGV);
> @@ -779,11 +773,12 @@ ModuleLinker::copyGlobalVariableProto(Ty
>    // No linking to be performed or linking from the source: simply create
> an
>    // identical version of the symbol over in the dest module... the
>    // initializer will be filled in later by LinkGlobalInits.
> -  GlobalVariable *NewDGV = new GlobalVariable(
> -      DstM, TypeMap.get(SGVar->getType()->getElementType()),
> -      SGVar->isConstant(), getLinkage(SGVar), /*init*/ nullptr,
> getName(SGVar),
> -      /*insertbefore*/ nullptr, SGVar->getThreadLocalMode(),
> -      SGVar->getType()->getAddressSpace());
> +  GlobalVariable *NewDGV =
> +      new GlobalVariable(DstM,
> TypeMap.get(SGVar->getType()->getElementType()),
> +                         SGVar->isConstant(),
> GlobalValue::ExternalLinkage,
> +                         /*init*/ nullptr, getName(SGVar),
> +                         /*insertbefore*/ nullptr,
> SGVar->getThreadLocalMode(),
> +                         SGVar->getType()->getAddressSpace());
>
>    return NewDGV;
>  }
> @@ -794,8 +789,8 @@ Function *ModuleLinker::copyFunctionProt
>                                            const Function *SF) {
>    // If there is no linkage to be performed or we are linking from the
> source,
>    // bring SF over.
> -  return Function::Create(TypeMap.get(SF->getFunctionType()),
> getLinkage(SF),
> -                          getName(SF), &DstM);
> +  return Function::Create(TypeMap.get(SF->getFunctionType()),
> +                          GlobalValue::ExternalLinkage, getName(SF),
> &DstM);
>  }
>
>  /// Set up prototypes for any aliases that come over from the source
> module.
> @@ -829,7 +824,7 @@ GlobalValue *ModuleLinker::copyGlobalAli
>    // bring over SGA.
>    auto *Ty = TypeMap.get(SGA->getValueType());
>    return GlobalAlias::create(Ty, SGA->getType()->getPointerAddressSpace(),
> -                             getLinkage(SGA), getName(SGA), &DstM);
> +                             GlobalValue::ExternalLinkage, getName(SGA),
> &DstM);
>  }
>
>  static GlobalValue::VisibilityTypes
> @@ -857,14 +852,31 @@ void ModuleLinker::setVisibility(GlobalV
>
>  GlobalValue *ModuleLinker::copyGlobalValueProto(TypeMapTy &TypeMap,
>                                                  const GlobalValue *SGV,
> -                                                const GlobalValue *DGV) {
> +                                                const GlobalValue *DGV,
> +                                                bool ForDefinition) {
>    GlobalValue *NewGV;
> -  if (auto *SGVar = dyn_cast<GlobalVariable>(SGV))
> +  if (auto *SGVar = dyn_cast<GlobalVariable>(SGV)) {
>      NewGV = copyGlobalVariableProto(TypeMap, SGVar);
> -  else if (auto *SF = dyn_cast<Function>(SGV))
> +  } else if (auto *SF = dyn_cast<Function>(SGV)) {
>      NewGV = copyFunctionProto(TypeMap, SF);
> -  else
> -    NewGV = copyGlobalAliasProto(TypeMap, cast<GlobalAlias>(SGV));
> +  } else {
> +    if (ForDefinition)
> +      NewGV = copyGlobalAliasProto(TypeMap, cast<GlobalAlias>(SGV));
> +    else
> +      NewGV = new GlobalVariable(
> +          DstM, TypeMap.get(SGV->getType()->getElementType()),
> +          /*isConstant*/ false, GlobalValue::ExternalLinkage,
> +          /*init*/ nullptr, getName(SGV),
> +          /*insertbefore*/ nullptr, SGV->getThreadLocalMode(),
> +          SGV->getType()->getAddressSpace());
> +  }
> +
> +  if (ForDefinition)
> +    NewGV->setLinkage(getLinkage(SGV));
> +  else if (SGV->hasAvailableExternallyLinkage() || SGV->hasWeakLinkage()
> ||
> +           SGV->hasLinkOnceLinkage())
> +    NewGV->setLinkage(GlobalValue::ExternalWeakLinkage);
> +
>    copyGVAttributes(NewGV, SGV);
>    setVisibility(NewGV, SGV, DGV);
>    return NewGV;
> @@ -1446,7 +1458,7 @@ bool ModuleLinker::linkGlobalValueProto(
>      // When linking from source we setVisibility from
> copyGlobalValueProto.
>      setVisibility(NewGV, SGV, DGV);
>    } else {
> -    NewGV = copyGlobalValueProto(TypeMap, SGV, DGV);
> +    NewGV = copyGlobalValueProto(TypeMap, SGV, DGV, LinkFromSrc);
>
>      if (isPerformingImport() && !doImportAsDefinition(SGV))
>        DoNotLinkFromSource.insert(SGV);
>
> Added: llvm/trunk/test/Linker/Inputs/comdat14.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/Inputs/comdat14.ll?rev=254538&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/Linker/Inputs/comdat14.ll (added)
> +++ llvm/trunk/test/Linker/Inputs/comdat14.ll Wed Dec  2 13:30:52 2015
> @@ -0,0 +1,12 @@
> +$c = comdat any
> +
> + at v2 = weak global i32 0, comdat ($c)
> +define i32* @f2() {
> +  ret i32* @v2
> +}
> +
> + at v3 = weak alias i32, i32* @v2
> +define i32* @f3() {
> +  ret i32* @v3
> +}
> +
>
> Added: llvm/trunk/test/Linker/comdat14.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/comdat14.ll?rev=254538&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/Linker/comdat14.ll (added)
> +++ llvm/trunk/test/Linker/comdat14.ll Wed Dec  2 13:30:52 2015
> @@ -0,0 +1,9 @@
> +; RUN: llvm-link -S %s %p/Inputs/comdat14.ll -o - | FileCheck %s
> +
> +$c = comdat any
> +
> + at v = global i32 0, comdat ($c)
> +
> +; CHECK: @v = global i32 0, comdat($c)
> +; CHECK: @v2 = extern_weak global i32
> +; CHECK: @v3 = extern_weak global i32
>
>
> _______________________________________________
> 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/20151202/5c2d27f7/attachment.html>


More information about the llvm-commits mailing list