[cfe-commits] r173538 - Preserve Sema::UndefinedInternals across PCH boundaries. Fixes

Richard Smith richard at metafoo.co.uk
Fri Jan 25 17:28:20 PST 2013


tools/clang/lib/Sema/Sema.cpp:377:8: warning: unused function
'operator<' [-Wunused-function]
  bool operator<(const UndefinedInternal &l, const UndefinedInternal &r) {
       ^

On Fri, Jan 25, 2013 at 4:35 PM, Nick Lewycky <nicholas at mxc.ca> wrote:
> Author: nicholas
> Date: Fri Jan 25 18:35:08 2013
> New Revision: 173538
>
> URL: http://llvm.org/viewvc/llvm-project?rev=173538&view=rev
> Log:
> Preserve Sema::UndefinedInternals across PCH boundaries. Fixes
> -Wundefined-internal warnings with PCH.
>
> Added:
>     cfe/trunk/test/PCH/undefined-internal.c
> Modified:
>     cfe/trunk/include/clang/Sema/ExternalSemaSource.h
>     cfe/trunk/include/clang/Sema/MultiplexExternalSemaSource.h
>     cfe/trunk/include/clang/Sema/Sema.h
>     cfe/trunk/include/clang/Serialization/ASTBitCodes.h
>     cfe/trunk/include/clang/Serialization/ASTReader.h
>     cfe/trunk/lib/Sema/MultiplexExternalSemaSource.cpp
>     cfe/trunk/lib/Sema/Sema.cpp
>     cfe/trunk/lib/Sema/SemaLookup.cpp
>     cfe/trunk/lib/Serialization/ASTReader.cpp
>     cfe/trunk/lib/Serialization/ASTWriter.cpp
>
> Modified: cfe/trunk/include/clang/Sema/ExternalSemaSource.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/ExternalSemaSource.h?rev=173538&r1=173537&r2=173538&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Sema/ExternalSemaSource.h (original)
> +++ cfe/trunk/include/clang/Sema/ExternalSemaSource.h Fri Jan 25 18:35:08 2013
> @@ -15,6 +15,7 @@
>
>  #include "clang/AST/ExternalASTSource.h"
>  #include "clang/Sema/Weak.h"
> +#include "llvm/ADT/MapVector.h"
>  #include <utility>
>
>  namespace clang {
> @@ -65,6 +66,9 @@ public:
>    /// which will be used during typo correction.
>    virtual void ReadKnownNamespaces(
>                             SmallVectorImpl<NamespaceDecl *> &Namespaces);
> +
> +  virtual void ReadUndefinedInternals(
> +                        llvm::MapVector<NamedDecl*, SourceLocation> &Undefined);
>
>    /// \brief Do last resort, unqualified lookup on a LookupResult that
>    /// Sema cannot find.
>
> Modified: cfe/trunk/include/clang/Sema/MultiplexExternalSemaSource.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/MultiplexExternalSemaSource.h?rev=173538&r1=173537&r2=173538&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Sema/MultiplexExternalSemaSource.h (original)
> +++ cfe/trunk/include/clang/Sema/MultiplexExternalSemaSource.h Fri Jan 25 18:35:08 2013
> @@ -252,6 +252,9 @@ public:
>    /// \brief Load the set of namespaces that are known to the external source,
>    /// which will be used during typo correction.
>    virtual void ReadKnownNamespaces(SmallVectorImpl<NamespaceDecl*> &Namespaces);
> +
> +  virtual void ReadUndefinedInternals(
> +                        llvm::MapVector<NamedDecl*, SourceLocation> &Undefined);
>
>    /// \brief Do last resort, unqualified lookup on a LookupResult that
>    /// Sema cannot find.
>
> Modified: cfe/trunk/include/clang/Sema/Sema.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=173538&r1=173537&r2=173538&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Sema/Sema.h (original)
> +++ cfe/trunk/include/clang/Sema/Sema.h Fri Jan 25 18:35:08 2013
> @@ -740,7 +740,7 @@ public:
>
>    /// UndefinedInternals - all the used, undefined objects with
>    /// internal linkage in this translation unit.
> -  llvm::DenseMap<NamedDecl*, SourceLocation> UndefinedInternals;
> +  llvm::MapVector<NamedDecl*, SourceLocation> UndefinedInternals;
>
>    typedef std::pair<ObjCMethodList, ObjCMethodList> GlobalMethods;
>    typedef llvm::DenseMap<Selector, GlobalMethods> GlobalMethodPool;
> @@ -2234,7 +2234,7 @@ private:
>    //
>    // The boolean value will be true to indicate that the namespace was loaded
>    // from an AST/PCH file, or false otherwise.
> -  llvm::DenseMap<NamespaceDecl*, bool> KnownNamespaces;
> +  llvm::MapVector<NamespaceDecl*, bool> KnownNamespaces;
>
>    /// \brief Whether we have already loaded known namespaces from an extenal
>    /// source.
>
> Modified: cfe/trunk/include/clang/Serialization/ASTBitCodes.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTBitCodes.h?rev=173538&r1=173537&r2=173538&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Serialization/ASTBitCodes.h (original)
> +++ cfe/trunk/include/clang/Serialization/ASTBitCodes.h Fri Jan 25 18:35:08 2013
> @@ -524,7 +524,11 @@ namespace clang {
>
>        /// \brief Record of updates for a macro that was modified after
>        /// being deserialized.
> -      MACRO_UPDATES = 48
> +      MACRO_UPDATES = 48,
> +
> +      /// \brief Record code for undefined but used internal functions and
> +      /// variables.
> +      UNDEFINED_INTERNALS = 49
>      };
>
>      /// \brief Record types used within a source manager block.
>
> Modified: cfe/trunk/include/clang/Serialization/ASTReader.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTReader.h?rev=173538&r1=173537&r2=173538&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Serialization/ASTReader.h (original)
> +++ cfe/trunk/include/clang/Serialization/ASTReader.h Fri Jan 25 18:35:08 2013
> @@ -677,6 +677,9 @@ private:
>    /// \brief A list of the namespaces we've seen.
>    SmallVector<uint64_t, 4> KnownNamespaces;
>
> +  /// \brief A list of undefined decls with internal linkage.
> +  SmallVector<uint64_t, 8> UndefinedInternals;
> +
>    /// \brief A list of modules that were imported by precompiled headers or
>    /// any other non-module AST file.
>    SmallVector<serialization::SubmoduleID, 2> ImportedModules;
> @@ -1505,6 +1508,9 @@ public:
>    virtual void ReadKnownNamespaces(
>                             SmallVectorImpl<NamespaceDecl *> &Namespaces);
>
> +  virtual void ReadUndefinedInternals(
> +                       llvm::MapVector<NamedDecl *, SourceLocation> &Undefined);
> +
>    virtual void ReadTentativeDefinitions(
>                   SmallVectorImpl<VarDecl *> &TentativeDefs);
>
> @@ -1675,13 +1681,13 @@ public:
>
>    /// \brief Read a source location.
>    SourceLocation ReadSourceLocation(ModuleFile &ModuleFile,
> -                                    const RecordData &Record, unsigned& Idx) {
> +                                    const RecordData &Record, unsigned &Idx) {
>      return ReadSourceLocation(ModuleFile, Record[Idx++]);
>    }
>
>    /// \brief Read a source range.
>    SourceRange ReadSourceRange(ModuleFile &F,
> -                              const RecordData &Record, unsigned& Idx);
> +                              const RecordData &Record, unsigned &Idx);
>
>    /// \brief Read an integral value
>    llvm::APInt ReadAPInt(const RecordData &Record, unsigned &Idx);
>
> Modified: cfe/trunk/lib/Sema/MultiplexExternalSemaSource.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/MultiplexExternalSemaSource.cpp?rev=173538&r1=173537&r2=173538&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/MultiplexExternalSemaSource.cpp (original)
> +++ cfe/trunk/lib/Sema/MultiplexExternalSemaSource.cpp Fri Jan 25 18:35:08 2013
> @@ -200,6 +200,12 @@ void MultiplexExternalSemaSource::ReadKn
>    for(size_t i = 0; i < Sources.size(); ++i)
>      Sources[i]->ReadKnownNamespaces(Namespaces);
>  }
> +
> +void MultiplexExternalSemaSource::ReadUndefinedInternals(
> +                        llvm::MapVector<NamedDecl*, SourceLocation> &Undefined){
> +  for(size_t i = 0; i < Sources.size(); ++i)
> +    Sources[i]->ReadUndefinedInternals(Undefined);
> +}
>
>  bool MultiplexExternalSemaSource::LookupUnqualified(LookupResult &R, Scope *S){
>    for(size_t i = 0; i < Sources.size(); ++i)
>
> Modified: cfe/trunk/lib/Sema/Sema.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.cpp?rev=173538&r1=173537&r2=173538&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/Sema.cpp (original)
> +++ cfe/trunk/lib/Sema/Sema.cpp Fri Jan 25 18:35:08 2013
> @@ -385,7 +385,7 @@ static void checkUndefinedInternals(Sema
>
>    // Collect all the still-undefined entities with internal linkage.
>    SmallVector<UndefinedInternal, 16> undefined;
> -  for (llvm::DenseMap<NamedDecl*,SourceLocation>::iterator
> +  for (llvm::MapVector<NamedDecl*,SourceLocation>::iterator
>           i = S.UndefinedInternals.begin(), e = S.UndefinedInternals.end();
>         i != e; ++i) {
>      NamedDecl *decl = i->first;
> @@ -407,23 +407,9 @@ static void checkUndefinedInternals(Sema
>          continue;
>      }
>
> -    // We build a FullSourceLoc so that we can sort with array_pod_sort.
> -    FullSourceLoc loc(i->second, S.Context.getSourceManager());
> -    undefined.push_back(UndefinedInternal(decl, loc));
> -  }
> -
> -  if (undefined.empty()) return;
> -
> -  // Sort (in order of use site) so that we're not (as) dependent on
> -  // the iteration order through an llvm::DenseMap.
> -  llvm::array_pod_sort(undefined.begin(), undefined.end());
> -
> -  for (SmallVectorImpl<UndefinedInternal>::iterator
> -         i = undefined.begin(), e = undefined.end(); i != e; ++i) {
> -    NamedDecl *decl = i->decl;
>      S.Diag(decl->getLocation(), diag::warn_undefined_internal)
>        << isa<VarDecl>(decl) << decl;
> -    S.Diag(i->useLoc, diag::note_used_here);
> +    S.Diag(i->second, diag::note_used_here);
>    }
>  }
>
> @@ -736,6 +722,8 @@ void Sema::ActOnEndOfTranslationUnit() {
>        }
>      }
>
> +    if (ExternalSource)
> +      ExternalSource->ReadUndefinedInternals(UndefinedInternals);
>      checkUndefinedInternals(*this);
>    }
>
> @@ -1080,6 +1068,10 @@ void ExternalSemaSource::ReadKnownNamesp
>                             SmallVectorImpl<NamespaceDecl *> &Namespaces) {
>  }
>
> +void ExternalSemaSource::ReadUndefinedInternals(
> +                      llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) {
> +}
> +
>  void PrettyDeclStackTraceEntry::print(raw_ostream &OS) const {
>    SourceLocation Loc = this->Loc;
>    if (!Loc.isValid() && TheDecl) Loc = TheDecl->getLocation();
>
> Modified: cfe/trunk/lib/Sema/SemaLookup.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaLookup.cpp?rev=173538&r1=173537&r2=173538&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaLookup.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaLookup.cpp Fri Jan 25 18:35:08 2013
> @@ -3857,7 +3857,7 @@ TypoCorrection Sema::CorrectTypo(const D
>          KnownNamespaces[ExternalKnownNamespaces[I]] = true;
>      }
>
> -    for (llvm::DenseMap<NamespaceDecl*, bool>::iterator
> +    for (llvm::MapVector<NamespaceDecl*, bool>::iterator
>             KNI = KnownNamespaces.begin(),
>             KNIEnd = KnownNamespaces.end();
>           KNI != KNIEnd; ++KNI)
>
> Modified: cfe/trunk/lib/Serialization/ASTReader.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=173538&r1=173537&r2=173538&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTReader.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTReader.cpp Fri Jan 25 18:35:08 2013
> @@ -2461,7 +2461,24 @@ bool ASTReader::ReadASTBlock(ModuleFile
>        for (unsigned I = 0, N = Record.size(); I != N; ++I)
>          KnownNamespaces.push_back(getGlobalDeclID(F, Record[I]));
>        break;
> -
> +
> +    case UNDEFINED_INTERNALS:
> +      if (UndefinedInternals.size() % 2 != 0) {
> +        Error("Invalid existing UndefinedInternals");
> +        return true;
> +      }
> +
> +      if (Record.size() % 2 != 0) {
> +        Error("invalid undefined internals record");
> +        return true;
> +      }
> +      for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) {
> +        UndefinedInternals.push_back(getGlobalDeclID(F, Record[I++]));
> +        UndefinedInternals.push_back(
> +            ReadSourceLocation(F, Record, I).getRawEncoding());
> +      }
> +      break;
> +
>      case IMPORTED_MODULES: {
>        if (F.Kind != MK_Module) {
>          // If we aren't loading a module (which has its own exports), make
> @@ -5934,6 +5951,17 @@ void ASTReader::ReadKnownNamespaces(
>    }
>  }
>
> +void ASTReader::ReadUndefinedInternals(
> +                       llvm::MapVector<NamedDecl*, SourceLocation> &Undefined) {
> +  for (unsigned Idx = 0, N = UndefinedInternals.size(); Idx != N;) {
> +    NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedInternals[Idx++]));
> +    SourceLocation Loc =
> +        SourceLocation::getFromRawEncoding(UndefinedInternals[Idx++]);
> +    Undefined.insert(std::make_pair(D, Loc));
> +  }
> +}
> +
> +
>  void ASTReader::ReadTentativeDefinitions(
>                    SmallVectorImpl<VarDecl *> &TentativeDefs) {
>    for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) {
>
> Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=173538&r1=173537&r2=173538&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTWriter.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTWriter.cpp Fri Jan 25 18:35:08 2013
> @@ -824,6 +824,7 @@ void ASTWriter::WriteBlockInfoBlock() {
>    RECORD(OPENCL_EXTENSIONS);
>    RECORD(DELEGATING_CTORS);
>    RECORD(KNOWN_NAMESPACES);
> +  RECORD(UNDEFINED_INTERNALS);
>    RECORD(MODULE_OFFSET_MAP);
>    RECORD(SOURCE_MANAGER_LINE_TABLE);
>    RECORD(OBJC_CATEGORIES_MAP);
> @@ -3581,7 +3582,7 @@ void ASTWriter::WriteASTCore(Sema &SemaR
>
>    // Build a record containing all of the known namespaces.
>    RecordData KnownNamespaces;
> -  for (llvm::DenseMap<NamespaceDecl*, bool>::iterator
> +  for (llvm::MapVector<NamespaceDecl*, bool>::iterator
>              I = SemaRef.KnownNamespaces.begin(),
>           IEnd = SemaRef.KnownNamespaces.end();
>         I != IEnd; ++I) {
> @@ -3589,6 +3590,16 @@ void ASTWriter::WriteASTCore(Sema &SemaR
>        AddDeclRef(I->first, KnownNamespaces);
>    }
>
> +  // Build a record of all used, undefined objects with internal linkage.
> +  RecordData UndefinedInternals;
> +  for (llvm::MapVector<NamedDecl*, SourceLocation>::iterator
> +            I = SemaRef.UndefinedInternals.begin(),
> +         IEnd = SemaRef.UndefinedInternals.end();
> +       I != IEnd; ++I) {
> +    AddDeclRef(I->first, UndefinedInternals);
> +    AddSourceLocation(I->second, UndefinedInternals);
> +  }
> +
>    // Write the control block
>    WriteControlBlock(PP, Context, isysroot, OutputFile);
>
> @@ -3803,6 +3814,10 @@ void ASTWriter::WriteASTCore(Sema &SemaR
>    // Write the known namespaces.
>    if (!KnownNamespaces.empty())
>      Stream.EmitRecord(KNOWN_NAMESPACES, KnownNamespaces);
> +
> +  // Write the undefined internal functions and variables.
> +  if (!UndefinedInternals.empty())
> +    Stream.EmitRecord(UNDEFINED_INTERNALS, UndefinedInternals);
>
>    // Write the visible updates to DeclContexts.
>    for (llvm::SmallPtrSet<const DeclContext *, 16>::iterator
>
> Added: cfe/trunk/test/PCH/undefined-internal.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/PCH/undefined-internal.c?rev=173538&view=auto
> ==============================================================================
> --- cfe/trunk/test/PCH/undefined-internal.c (added)
> +++ cfe/trunk/test/PCH/undefined-internal.c Fri Jan 25 18:35:08 2013
> @@ -0,0 +1,15 @@
> +// RUN: %clang_cc1 -emit-pch %s -o %t
> +// RUN: %clang_cc1 -include-pch %t %s -verify
> +#ifndef HEADER_H
> +#define HEADER_H
> +static void f();
> +static void g();
> +void h() {
> +  f();
> +  g();
> +}
> +#else
> +static void g() {}
> +// expected-warning at 5{{function 'f' has internal linkage but is not defined}}
> +// expected-note at 8{{used here}}
> +#endif
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list