r307434 - [modules ts] Basic for module linkage.

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Fri Jul 7 13:06:21 PDT 2017


On 7 July 2017 at 13:04, Richard Smith via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: rsmith
> Date: Fri Jul  7 13:04:28 2017
> New Revision: 307434
>
> URL: http://llvm.org/viewvc/llvm-project?rev=307434&view=rev
> Log:
> [modules ts] Basic for module linkage.
>

Sorry, that should say "Basic *support* for module linkage."


> In addition to the formal linkage rules, the Modules TS includes cases
> where
> internal-linkage symbols within a module interface unit can be referenced
> from
> outside the module via exported inline functions / templates. We give such
> declarations "module-internal linkage", which is formally internal
> linkage, but
> results in an externally-visible symbol.
>
> Modified:
>     cfe/trunk/include/clang/Basic/Linkage.h
>     cfe/trunk/lib/AST/Decl.cpp
>     cfe/trunk/lib/CodeGen/CodeGenModule.cpp
>     cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp
>     cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp
>     cfe/trunk/lib/Index/IndexSymbol.cpp
>     cfe/trunk/test/CXX/modules-ts/basic/basic.def.odr/p4/module.cpp
>     cfe/trunk/test/CXX/modules-ts/basic/basic.def.odr/p4/module.cppm
>     cfe/trunk/test/CXX/modules-ts/basic/basic.def.odr/p4/user.cpp
>
> Modified: cfe/trunk/include/clang/Basic/Linkage.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/
> clang/Basic/Linkage.h?rev=307434&r1=307433&r2=307434&view=diff
> ============================================================
> ==================
> --- cfe/trunk/include/clang/Basic/Linkage.h (original)
> +++ cfe/trunk/include/clang/Basic/Linkage.h Fri Jul  7 13:04:28 2017
> @@ -45,6 +45,17 @@ enum Linkage : unsigned char {
>    /// translation units because of types defined in a inline function.
>    VisibleNoLinkage,
>
> +  /// \brief Internal linkage according to the Modules TS, but can be
> referred
> +  /// to from other translation units indirectly through inline functions
> and
> +  /// templates in the module interface.
> +  ModuleInternalLinkage,
> +
> +  /// \brief Module linkage, which indicates that the entity can be
> referred
> +  /// to from other translation units within the same module, and
> indirectly
> +  /// from arbitrary other translation units through inline functions and
> +  /// templates in the module interface.
> +  ModuleLinkage,
> +
>    /// \brief External linkage, which indicates that the entity can
>    /// be referred to from other translation units.
>    ExternalLinkage
> @@ -74,15 +85,20 @@ inline bool isDiscardableGVALinkage(GVAL
>  }
>
>  inline bool isExternallyVisible(Linkage L) {
> -  return L == ExternalLinkage || L == VisibleNoLinkage;
> +  return L >= VisibleNoLinkage;
>  }
>
>  inline Linkage getFormalLinkage(Linkage L) {
> -  if (L == UniqueExternalLinkage)
> +  switch (L) {
> +  case UniqueExternalLinkage:
>      return ExternalLinkage;
> -  if (L == VisibleNoLinkage)
> +  case VisibleNoLinkage:
>      return NoLinkage;
> -  return L;
> +  case ModuleInternalLinkage:
> +    return InternalLinkage;
> +  default:
> +    return L;
> +  }
>  }
>
>  inline bool isExternalFormalLinkage(Linkage L) {
>
> Modified: cfe/trunk/lib/AST/Decl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/
> Decl.cpp?rev=307434&r1=307433&r2=307434&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/AST/Decl.cpp (original)
> +++ cfe/trunk/lib/AST/Decl.cpp Fri Jul  7 13:04:28 2017
> @@ -573,6 +573,44 @@ static bool isSingleLineLanguageLinkage(
>    return false;
>  }
>
> +static bool isExportedFromModuleIntefaceUnit(const NamedDecl *D) {
> +  switch (D->getModuleOwnershipKind()) {
> +  case Decl::ModuleOwnershipKind::Unowned:
> +  case Decl::ModuleOwnershipKind::ModulePrivate:
> +    return false;
> +  case Decl::ModuleOwnershipKind::Visible:
> +  case Decl::ModuleOwnershipKind::VisibleWhenImported:
> +    if (auto *M = D->getOwningModule())
> +      return M->Kind == Module::ModuleInterfaceUnit;
> +  }
> +  llvm_unreachable("unexpected module ownership kind");
> +}
> +
> +static LinkageInfo getInternalLinkageFor(const NamedDecl *D) {
> +  // Internal linkage declarations within a module interface unit are
> modeled
> +  // as "module-internal linkage", which means that they have internal
> linkage
> +  // formally but can be indirectly accessed from outside the module via
> inline
> +  // functions and templates defined within the module.
> +  if (auto *M = D->getOwningModule())
> +    if (M->Kind == Module::ModuleInterfaceUnit)
> +      return LinkageInfo(ModuleInternalLinkage, DefaultVisibility,
> false);
> +
> +  return LinkageInfo::internal();
> +}
> +
> +static LinkageInfo getExternalLinkageFor(const NamedDecl *D) {
> +  // C++ Modules TS [basic.link]/6.8:
> +  //   - A name declared at namespace scope that does not have internal
> linkage
> +  //     by the previous rules and that is introduced by a non-exported
> +  //     declaration has module linkage.
> +  if (auto *M = D->getOwningModule())
> +    if (M->Kind == Module::ModuleInterfaceUnit)
> +      if (!isExportedFromModuleIntefaceUnit(D))
> +        return LinkageInfo(ModuleLinkage, DefaultVisibility, false);
> +
> +  return LinkageInfo::external();
> +}
> +
>  static LinkageInfo getLVForNamespaceScopeDecl(const NamedDecl *D,
>                                                LVComputationKind
> computation) {
>    assert(D->getDeclContext()->getRedeclContext()->isFileContext() &&
> @@ -588,16 +626,18 @@ static LinkageInfo getLVForNamespaceScop
>    if (const auto *Var = dyn_cast<VarDecl>(D)) {
>      // Explicitly declared static.
>      if (Var->getStorageClass() == SC_Static)
> -      return LinkageInfo::internal();
> +      return getInternalLinkageFor(Var);
>
>      // - a non-inline, non-volatile object or reference that is explicitly
>      //   declared const or constexpr and neither explicitly declared
> extern
>      //   nor previously declared to have external linkage; or (there is no
>      //   equivalent in C99)
> +    // The C++ modules TS adds "non-exported" to this list.
>      if (Context.getLangOpts().CPlusPlus &&
>          Var->getType().isConstQualified() &&
>          !Var->getType().isVolatileQualified() &&
> -        !Var->isInline()) {
> +        !Var->isInline() &&
> +        !isExportedFromModuleIntefaceUnit(Var)) {
>        const VarDecl *PrevVar = Var->getPreviousDecl();
>        if (PrevVar)
>          return getLVForDecl(PrevVar, computation);
> @@ -605,7 +645,7 @@ static LinkageInfo getLVForNamespaceScop
>        if (Var->getStorageClass() != SC_Extern &&
>            Var->getStorageClass() != SC_PrivateExtern &&
>            !isSingleLineLanguageLinkage(*Var))
> -        return LinkageInfo::internal();
> +        return getInternalLinkageFor(Var);
>      }
>
>      for (const VarDecl *PrevVar = Var->getPreviousDecl(); PrevVar;
> @@ -615,7 +655,7 @@ static LinkageInfo getLVForNamespaceScop
>          return PrevVar->getLinkageAndVisibility();
>        // Explicitly declared static.
>        if (PrevVar->getStorageClass() == SC_Static)
> -        return LinkageInfo::internal();
> +        return getInternalLinkageFor(Var);
>      }
>    } else if (const FunctionDecl *Function = D->getAsFunction()) {
>      // C++ [temp]p4:
> @@ -624,7 +664,7 @@ static LinkageInfo getLVForNamespaceScop
>
>      // Explicitly declared static.
>      if (Function->getCanonicalDecl()->getStorageClass() == SC_Static)
> -      return LinkageInfo(InternalLinkage, DefaultVisibility, false);
> +      return getInternalLinkageFor(Function);
>    } else if (const auto *IFD = dyn_cast<IndirectFieldDecl>(D)) {
>      //   - a data member of an anonymous union.
>      const VarDecl *VD = IFD->getVarDecl();
> @@ -637,7 +677,12 @@ static LinkageInfo getLVForNamespaceScop
>      const auto *Var = dyn_cast<VarDecl>(D);
>      const auto *Func = dyn_cast<FunctionDecl>(D);
>      // FIXME: In C++11 onwards, anonymous namespaces should give decls
> -    // within them internal linkage, not unique external linkage.
> +    // within them (including those inside extern "C" contexts) internal
> +    // linkage, not unique external linkage:
> +    //
> +    // C++11 [basic.link]p4:
> +    //   An unnamed namespace or a namespace declared directly or
> indirectly
> +    //   within an unnamed namespace has internal linkage.
>      if ((!Var || !isFirstInExternCContext(Var)) &&
>          (!Func || !isFirstInExternCContext(Func)))
>        return LinkageInfo::uniqueExternal();
> @@ -718,7 +763,8 @@ static LinkageInfo getLVForNamespaceScop
>      // because of this, but unique-external linkage suits us.
>      if (Context.getLangOpts().CPlusPlus &&
> !isFirstInExternCContext(Var)) {
>        LinkageInfo TypeLV = getLVForType(*Var->getType(), computation);
> -      if (TypeLV.getLinkage() != ExternalLinkage)
> +      if (TypeLV.getLinkage() != ExternalLinkage &&
> +          TypeLV.getLinkage() != ModuleLinkage)
>          return LinkageInfo::uniqueExternal();
>        if (!LV.isVisibilityExplicit())
>          LV.mergeVisibility(TypeLV);
> @@ -816,7 +862,9 @@ static LinkageInfo getLVForNamespaceScop
>
>    //     - a namespace (7.3), unless it is declared within an unnamed
>    //       namespace.
> -  } else if (isa<NamespaceDecl>(D) && !D->isInAnonymousNamespace()) {
> +  //
> +  // We handled names in anonymous namespaces above.
> +  } else if (isa<NamespaceDecl>(D)) {
>      return LV;
>
>    // By extension, we assign external linkage to Objective-C
> @@ -1125,6 +1173,8 @@ static LinkageInfo getLVForClosure(const
>    if (const auto *ND = dyn_cast<NamedDecl>(DC))
>      return getLVForDecl(ND, computation);
>
> +  // FIXME: We have a closure at TU scope with no context declaration.
> This
> +  // should probably have no linkage.
>    return LinkageInfo::external();
>  }
>
> @@ -1137,7 +1187,7 @@ static LinkageInfo getLVForLocalDecl(con
>
>      // This is a "void f();" which got merged with a file static.
>      if (Function->getCanonicalDecl()->getStorageClass() == SC_Static)
> -      return LinkageInfo::internal();
> +      return getInternalLinkageFor(Function);
>
>      LinkageInfo LV;
>      if (!hasExplicitVisibilityAlready(computation)) {
> @@ -1226,7 +1276,7 @@ static LinkageInfo computeLVForDecl(cons
>                                      LVComputationKind computation) {
>    // Internal_linkage attribute overrides other considerations.
>    if (D->hasAttr<InternalLinkageAttr>())
> -    return LinkageInfo::internal();
> +    return getInternalLinkageFor(D);
>
>    // Objective-C: treat all Objective-C declarations as having external
>    // linkage.
> @@ -1275,14 +1325,14 @@ static LinkageInfo computeLVForDecl(cons
>      case Decl::ObjCProperty:
>      case Decl::ObjCPropertyImpl:
>      case Decl::ObjCProtocol:
> -      return LinkageInfo::external();
> +      return getExternalLinkageFor(D);
>
>      case Decl::CXXRecord: {
>        const auto *Record = cast<CXXRecordDecl>(D);
>        if (Record->isLambda()) {
>          if (!Record->getLambdaManglingNumber()) {
>            // This lambda has no mangling number, so it's internal.
> -          return LinkageInfo::internal();
> +          return getInternalLinkageFor(D);
>          }
>
>          // This lambda has its linkage/visibility determined:
> @@ -1298,7 +1348,7 @@ static LinkageInfo computeLVForDecl(cons
>          const CXXRecordDecl *OuterMostLambda =
>              getOutermostEnclosingLambda(Record);
>          if (!OuterMostLambda->getLambdaManglingNumber())
> -          return LinkageInfo::internal();
> +          return getInternalLinkageFor(D);
>
>          return getLVForClosure(
>                    OuterMostLambda->getDeclContext()->getRedeclContext(),
> @@ -1349,7 +1399,7 @@ public:
>                                    LVComputationKind computation) {
>      // Internal_linkage attribute overrides other considerations.
>      if (D->hasAttr<InternalLinkageAttr>())
> -      return LinkageInfo::internal();
> +      return getInternalLinkageFor(D);
>
>      if (computation == LVForLinkageOnly && D->hasCachedLinkage())
>        return LinkageInfo(D->getCachedLinkage(), DefaultVisibility,
> false);
>
> Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/
> CodeGenModule.cpp?rev=307434&r1=307433&r2=307434&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Fri Jul  7 13:04:28 2017
> @@ -1098,7 +1098,7 @@ static void setLinkageAndVisibilityForGV
>                                           const NamedDecl *ND) {
>    // Set linkage and visibility in case we never see a definition.
>    LinkageInfo LV = ND->getLinkageAndVisibility();
> -  if (LV.getLinkage() != ExternalLinkage) {
> +  if (!isExternallyVisible(LV.getLinkage())) {
>      // Don't set internal linkage on declarations.
>    } else {
>      if (ND->hasAttr<DLLImportAttr>()) {
>
> Modified: cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/
> ItaniumCXXABI.cpp?rev=307434&r1=307433&r2=307434&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp (original)
> +++ cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp Fri Jul  7 13:04:28 2017
> @@ -2959,6 +2959,8 @@ static llvm::GlobalVariable::LinkageType
>      return llvm::GlobalValue::InternalLinkage;
>
>    case VisibleNoLinkage:
> +  case ModuleInternalLinkage:
> +  case ModuleLinkage:
>    case ExternalLinkage:
>      // RTTI is not enabled, which means that this type info struct is
> going
>      // to be used for exception handling. Give it linkonce_odr linkage.
>
> Modified: cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/
> MicrosoftCXXABI.cpp?rev=307434&r1=307433&r2=307434&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp (original)
> +++ cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp Fri Jul  7 13:04:28 2017
> @@ -3425,6 +3425,8 @@ static llvm::GlobalValue::LinkageTypes g
>      return llvm::GlobalValue::InternalLinkage;
>
>    case VisibleNoLinkage:
> +  case ModuleInternalLinkage:
> +  case ModuleLinkage:
>    case ExternalLinkage:
>      return llvm::GlobalValue::LinkOnceODRLinkage;
>    }
>
> Modified: cfe/trunk/lib/Index/IndexSymbol.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/
> IndexSymbol.cpp?rev=307434&r1=307433&r2=307434&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Index/IndexSymbol.cpp (original)
> +++ cfe/trunk/lib/Index/IndexSymbol.cpp Fri Jul  7 13:04:28 2017
> @@ -69,11 +69,13 @@ bool index::isFunctionLocalSymbol(const
>    if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) {
>      switch (ND->getFormalLinkage()) {
>        case NoLinkage:
> -      case VisibleNoLinkage:
>        case InternalLinkage:
>          return true;
> +      case VisibleNoLinkage:
>        case UniqueExternalLinkage:
> +      case ModuleInternalLinkage:
>          llvm_unreachable("Not a sema linkage");
> +      case ModuleLinkage:
>        case ExternalLinkage:
>          return false;
>      }
>
> Modified: cfe/trunk/test/CXX/modules-ts/basic/basic.def.odr/p4/module.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/
> modules-ts/basic/basic.def.odr/p4/module.cpp?rev=307434&
> r1=307433&r2=307434&view=diff
> ============================================================
> ==================
> --- cfe/trunk/test/CXX/modules-ts/basic/basic.def.odr/p4/module.cpp
> (original)
> +++ cfe/trunk/test/CXX/modules-ts/basic/basic.def.odr/p4/module.cpp Fri
> Jul  7 13:04:28 2017
> @@ -1,6 +1,19 @@
>  // RUN: %clang_cc1 -fmodules-ts %S/module.cppm -triple
> %itanium_abi_triple -emit-module-interface -o %t
>  // RUN: %clang_cc1 -fmodules-ts %s -triple %itanium_abi_triple
> -fmodule-file=%t -emit-llvm -o - | FileCheck %s --implicit-check-not=unused
> --implicit-check-not=global_module
>
> +// CHECK-DAG: @extern_var_exported = external global
> +// FIXME: Should this be 'external global'?
> +// CHECK-DAG: @inline_var_exported = linkonce_odr global
> +// CHECK-DAG: @_ZL19static_var_exported = external global
> +// CHECK-DAG: @const_var_exported = external constant
> +//
> +// FIXME: The module name should be mangled into all of these.
> +// CHECK-DAG: @extern_var_module_linkage = external global
> +// FIXME: Should this be 'external global'?
> +// CHECK-DAG: @inline_var_module_linkage = linkonce_odr global
> +// CHECK-DAG: @_ZL25static_var_module_linkage = external global
> +// CHECK-DAG: @_ZL24const_var_module_linkage = external constant
> +
>  module Module;
>
>  void use() {
> @@ -9,8 +22,13 @@ void use() {
>    // CHECK: declare {{.*}}@_Z18noninline_exportedv
>    noninline_exported();
>
> +  (void)&extern_var_exported;
> +  (void)&inline_var_exported;
> +  (void)&static_var_exported; // FIXME: Should not be exported.
> +  (void)&const_var_exported;
> +
>    // FIXME: This symbol should not be visible here.
> -  // CHECK: define internal {{.*}}@_ZL26used_static_module_linkagev
> +  // CHECK: declare {{.*}}@_ZL26used_static_module_linkagev
>    used_static_module_linkage();
>
>    // FIXME: The module name should be mangled into the name of this
> function.
> @@ -20,4 +38,9 @@ void use() {
>    // FIXME: The module name should be mangled into the name of this
> function.
>    // CHECK: declare {{.*}}@_Z24noninline_module_linkagev
>    noninline_module_linkage();
> +
> +  (void)&extern_var_module_linkage;
> +  (void)&inline_var_module_linkage;
> +  (void)&static_var_module_linkage; // FIXME: Should not be visible here.
> +  (void)&const_var_module_linkage;
>  }
>
> Modified: cfe/trunk/test/CXX/modules-ts/basic/basic.def.odr/p4/module.cppm
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/
> modules-ts/basic/basic.def.odr/p4/module.cppm?rev=307434&
> r1=307433&r2=307434&view=diff
> ============================================================
> ==================
> --- cfe/trunk/test/CXX/modules-ts/basic/basic.def.odr/p4/module.cppm
> (original)
> +++ cfe/trunk/test/CXX/modules-ts/basic/basic.def.odr/p4/module.cppm Fri
> Jul  7 13:04:28 2017
> @@ -1,9 +1,39 @@
> -// RUN: %clang_cc1 -fmodules-ts %s -triple %itanium_abi_triple -emit-llvm
> -o - | FileCheck %s --implicit-check-not=unused
> +// RUN: %clang_cc1 -fmodules-ts %s -triple %itanium_abi_triple -emit-llvm
> -o - | FileCheck %s --implicit-check-not unused_inline --implicit-check-not
> unused_stastic_global_module
> +
> +// CHECK-DAG: @extern_var_global_module = external global
> +// CHECK-DAG: @inline_var_global_module = linkonce_odr global
> +// CHECK-DAG: @_ZL24static_var_global_module = internal global
> +// CHECK-DAG: @_ZL23const_var_global_module = internal constant
> +//
> +// For ABI compatibility, these symbols do not include the module name.
> +// CHECK-DAG: @extern_var_exported = external global
> +// FIXME: Should this be 'weak_odr global'? Presumably it must be, since
> we
> +// can discard this global and its initializer (if any), and other TUs
> are not
> +// permitted to run the initializer for this variable.
> +// CHECK-DAG: @inline_var_exported = linkonce_odr global
> +// CHECK-DAG: @_ZL19static_var_exported = global
> +// CHECK-DAG: @const_var_exported = constant
> +//
> +// FIXME: The module name should be mangled into all of these.
> +// CHECK-DAG: @extern_var_module_linkage = external global
> +// FIXME: Should this be 'weak_odr global'? Presumably it must be, since
> we
> +// can discard this global and its initializer (if any), and other TUs
> are not
> +// permitted to run the initializer for this variable.
> +// CHECK-DAG: @inline_var_module_linkage = linkonce_odr global
> +// CHECK-DAG: @_ZL25static_var_module_linkage = global
> +// CHECK-DAG: @_ZL24const_var_module_linkage = constant
>
>  static void unused_static_global_module() {}
>  static void used_static_global_module() {}
> +
>  inline void unused_inline_global_module() {}
>  inline void used_inline_global_module() {}
> +
> +extern int extern_var_global_module;
> +inline int inline_var_global_module;
> +static int static_var_global_module;
> +const int const_var_global_module = 3;
> +
>  // CHECK: define void {{.*}}@_Z23noninline_global_modulev
>  void noninline_global_module() {
>    // FIXME: This should be promoted to module linkage and given a
> @@ -15,6 +45,11 @@ void noninline_global_module() {
>    used_static_global_module();
>    // CHECK: define linkonce_odr {{.*}}@_Z25used_inline_global_modulev
>    used_inline_global_module();
> +
> +  (void)&extern_var_global_module;
> +  (void)&inline_var_global_module;
> +  (void)&static_var_global_module;
> +  (void)&const_var_global_module;
>  }
>
>  export module Module;
> @@ -22,33 +57,62 @@ export module Module;
>  export {
>    // FIXME: These should be ill-formed: you can't export an internal
> linkage
>    // symbol, per [dcl.module.interface]p2.
> +  // CHECK: define void {{.*}}@_ZL22unused_static_exportedv
>    static void unused_static_exported() {}
> +  // CHECK: define void {{.*}}@_ZL20used_static_exportedv
>    static void used_static_exported() {}
>
>    inline void unused_inline_exported() {}
>    inline void used_inline_exported() {}
> +
> +  extern int extern_var_exported;
> +  inline int inline_var_exported;
> +  // FIXME: This should be ill-formed: you can't export an internal
> linkage
> +  // symbol.
> +  static int static_var_exported;
> +  const int const_var_exported = 3;
> +
>    // CHECK: define void {{.*}}@_Z18noninline_exportedv
>    void noninline_exported() {
> -    // CHECK: define internal {{.*}}@_ZL20used_static_exportedv
>      used_static_exported();
>      // CHECK: define linkonce_odr {{.*}}@_Z20used_inline_exportedv
>      used_inline_exported();
> +
> +    (void)&extern_var_exported;
> +    (void)&inline_var_exported;
> +    (void)&static_var_exported;
> +    (void)&const_var_exported;
>    }
>  }
>
> +// FIXME: Ideally we wouldn't emit this as its name is not visible
> outside this
> +// TU, but this module interface might contain a template that can use
> this
> +// function so we conservatively emit it for now.
> +// FIXME: The module name should be mangled into the name of this
> function.
> +// CHECK: define void {{.*}}@_ZL28unused_static_module_linkagev
>  static void unused_static_module_linkage() {}
> +// FIXME: The module name should be mangled into the name of this
> function.
> +// CHECK: define void {{.*}}@_ZL26used_static_module_linkagev
>  static void used_static_module_linkage() {}
> +
>  inline void unused_inline_module_linkage() {}
>  inline void used_inline_module_linkage() {}
> +
> +extern int extern_var_module_linkage;
> +inline int inline_var_module_linkage;
> +static int static_var_module_linkage;
> +const int const_var_module_linkage = 3;
> +
>  // FIXME: The module name should be mangled into the name of this
> function.
>  // CHECK: define void {{.*}}@_Z24noninline_module_linkagev
>  void noninline_module_linkage() {
> -  // FIXME: This should be promoted to module linkage and given a
> -  // module-mangled name, if it's called from an inline function within
> -  // the module interface.
> -  // CHECK: define internal {{.*}}@_ZL26used_static_module_linkagev
>    used_static_module_linkage();
>    // FIXME: The module name should be mangled into the name of this
> function.
>    // CHECK: define linkonce_odr {{.*}}@_Z26used_inline_module_linkagev
>    used_inline_module_linkage();
> +
> +  (void)&extern_var_module_linkage;
> +  (void)&inline_var_module_linkage;
> +  (void)&static_var_module_linkage;
> +  (void)&const_var_module_linkage;
>  }
>
> Modified: cfe/trunk/test/CXX/modules-ts/basic/basic.def.odr/p4/user.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CXX/
> modules-ts/basic/basic.def.odr/p4/user.cpp?rev=307434&r1=
> 307433&r2=307434&view=diff
> ============================================================
> ==================
> --- cfe/trunk/test/CXX/modules-ts/basic/basic.def.odr/p4/user.cpp
> (original)
> +++ cfe/trunk/test/CXX/modules-ts/basic/basic.def.odr/p4/user.cpp Fri
> Jul  7 13:04:28 2017
> @@ -1,6 +1,13 @@
>  // RUN: %clang_cc1 -fmodules-ts %S/module.cppm -triple
> %itanium_abi_triple -emit-module-interface -o %t
>  // RUN: %clang_cc1 -fmodules-ts %s -triple %itanium_abi_triple
> -fmodule-file=%t -emit-llvm -o - | FileCheck %s --implicit-check-not=unused
> --implicit-check-not=global_module
>
> +// CHECK-DAG: @extern_var_exported = external global
> +// FIXME: Should this be 'external global'?
> +// CHECK-DAG: @inline_var_exported = linkonce_odr global
> +// FIXME: These should be 'extern global' and 'extern constant'.
> +// CHECK-DAG: @_ZL19static_var_exported = global
> +// CHECK-DAG: @const_var_exported = constant
> +
>  import Module;
>
>  void use() {
> @@ -9,5 +16,10 @@ void use() {
>    // CHECK: declare {{.*}}@_Z18noninline_exportedv
>    noninline_exported();
>
> +  (void)&extern_var_exported;
> +  (void)&inline_var_exported;
> +  (void)&static_var_exported;
> +  (void)&const_var_exported;
> +
>    // Module-linkage declarations are not visible here.
>  }
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170707/023c9808/attachment-0001.html>


More information about the cfe-commits mailing list