[cfe-commits] r150881 - in /cfe/trunk: include/clang/Parse/Parser.h include/clang/Sema/Sema.h lib/Frontend/InitPreprocessor.cpp lib/Parse/ParsePragma.cpp lib/Parse/ParsePragma.h lib/Parse/Parser.cpp lib/Sema/SemaDecl.cpp test/CodeGen/redefine_ext

Chandler Carruth chandlerc at google.com
Sat Feb 18 13:34:50 PST 2012


On Sat, Feb 18, 2012 at 8:12 AM, David Chisnall <csdavec at swan.ac.uk> wrote:

> Author: theraven
> Date: Sat Feb 18 10:12:34 2012
> New Revision: 150881
>
> URL: http://llvm.org/viewvc/llvm-project?rev=150881&view=rev
> Log:
> Implement #pragma redefine_extname.
>
> This fixes PR5172 and allows clang to compile C++ programs on Solaris
> using the system headers.
>
>
> Added:
>    cfe/trunk/test/CodeGen/redefine_extname.c
> Modified:
>    cfe/trunk/include/clang/Parse/Parser.h
>    cfe/trunk/include/clang/Sema/Sema.h
>    cfe/trunk/lib/Frontend/InitPreprocessor.cpp
>    cfe/trunk/lib/Parse/ParsePragma.cpp
>    cfe/trunk/lib/Parse/ParsePragma.h
>    cfe/trunk/lib/Parse/Parser.cpp
>    cfe/trunk/lib/Sema/SemaDecl.cpp
>
> Modified: cfe/trunk/include/clang/Parse/Parser.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Parser.h?rev=150881&r1=150880&r2=150881&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Parse/Parser.h (original)
> +++ cfe/trunk/include/clang/Parse/Parser.h Sat Feb 18 10:12:34 2012
> @@ -162,6 +162,7 @@
>   OwningPtr<PragmaHandler> MSStructHandler;
>   OwningPtr<PragmaHandler> UnusedHandler;
>   OwningPtr<PragmaHandler> WeakHandler;
> +  OwningPtr<PragmaHandler> RedefineExtnameHandler;
>   OwningPtr<PragmaHandler> FPContractHandler;
>   OwningPtr<PragmaHandler> OpenCLExtensionHandler;
>
>
> Modified: cfe/trunk/include/clang/Sema/Sema.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=150881&r1=150880&r2=150881&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Sema/Sema.h (original)
> +++ cfe/trunk/include/clang/Sema/Sema.h Sat Feb 18 10:12:34 2012
> @@ -469,6 +469,13 @@
>   /// identifier, declared or undeclared
>   llvm::DenseMap<IdentifierInfo*,WeakInfo> WeakUndeclaredIdentifiers;
>
> +  /// ExtnameUndeclaredIdentifiers - Identifiers contained in
> +  /// #pragma redefine_extname before declared.  Used in Solaris system
> headers
> +  /// to define functions that occur in multiple standards to call the
> version
> +  /// in the currently selected standard.
> +  llvm::DenseMap<IdentifierInfo*,AsmLabelAttr*>
> ExtnameUndeclaredIdentifiers;
> +
> +
>   /// \brief Load weak undeclared identifiers from the external source.
>   void LoadExternalWeakUndeclaredIdentifiers();
>
> @@ -5719,6 +5726,14 @@
>                          SourceLocation PragmaLoc,
>                          SourceLocation WeakNameLoc);
>
> +  /// ActOnPragmaRedefineExtname - Called on well formed
> +  /// #pragma redefine_extname oldname newname.
> +  void ActOnPragmaRedefineExtname(IdentifierInfo* WeakName,
> +                                  IdentifierInfo* AliasName,
> +                                  SourceLocation PragmaLoc,
> +                                  SourceLocation WeakNameLoc,
> +                                  SourceLocation AliasNameLoc);
> +
>   /// ActOnPragmaWeakAlias - Called on well formed #pragma weak ident =
> ident.
>   void ActOnPragmaWeakAlias(IdentifierInfo* WeakName,
>                             IdentifierInfo* AliasName,
>
> Modified: cfe/trunk/lib/Frontend/InitPreprocessor.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/InitPreprocessor.cpp?rev=150881&r1=150880&r2=150881&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Frontend/InitPreprocessor.cpp (original)
> +++ cfe/trunk/lib/Frontend/InitPreprocessor.cpp Sat Feb 18 10:12:34 2012
> @@ -333,6 +333,9 @@
>   Builder.defineMacro("__ATOMIC_ACQ_REL", "4");
>   Builder.defineMacro("__ATOMIC_SEQ_CST", "5");
>
> +  // Support for #pragma redefine_extname (Sun compatibility)
> +  Builder.defineMacro("__PRAGMA_REDEFINE_EXTNAME", "1");
> +
>   // As sad as it is, enough software depends on the __VERSION__ for
> version
>   // checks that it is necessary to report 4.2.1 (the base GCC version we
> claim
>   // compatibility with) first.
>
> Modified: cfe/trunk/lib/Parse/ParsePragma.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParsePragma.cpp?rev=150881&r1=150880&r2=150881&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Parse/ParsePragma.cpp (original)
> +++ cfe/trunk/lib/Parse/ParsePragma.cpp Sat Feb 18 10:12:34 2012
> @@ -426,6 +426,44 @@
>   }
>  }
>
> +// #pragma redefine_extname identifier identifier
> +void PragmaRedefineExtnameHandler::HandlePragma(Preprocessor &PP,
> +                                               PragmaIntroducerKind
> Introducer,
> +                                                Token &RedefToken) {
> +  SourceLocation RedefLoc = RedefToken.getLocation();
> +
> +  Token Tok;
> +  PP.Lex(Tok);
> +  if (Tok.isNot(tok::identifier)) {
> +    PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_identifier) <<
> +      "redefine_extname";
> +    return;
> +  }
> +
> +  IdentifierInfo *RedefName = Tok.getIdentifierInfo(), *AliasName = 0;
> +  SourceLocation RedefNameLoc = Tok.getLocation(), AliasNameLoc;
> +
> +  PP.Lex(Tok);
> +  if (Tok.isNot(tok::identifier)) {
> +    PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_identifier)
> +        << "redefine_extname";
> +    return;
> +  }
> +  AliasName = Tok.getIdentifierInfo();
> +  AliasNameLoc = Tok.getLocation();
> +  PP.Lex(Tok);
> +
> +  if (Tok.isNot(tok::eod)) {
> +    PP.Diag(Tok.getLocation(), diag::warn_pragma_extra_tokens_at_eol) <<
> +      "redefine_extname";
> +    return;
> +  }
> +
> +  Actions.ActOnPragmaRedefineExtname(RedefName, AliasName, RedefLoc,
> +      RedefNameLoc, AliasNameLoc);
> +}
> +
> +
>  void
>  PragmaFPContractHandler::HandlePragma(Preprocessor &PP,
>                                       PragmaIntroducerKind Introducer,
>
> Modified: cfe/trunk/lib/Parse/ParsePragma.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParsePragma.h?rev=150881&r1=150880&r2=150881&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Parse/ParsePragma.h (original)
> +++ cfe/trunk/lib/Parse/ParsePragma.h Sat Feb 18 10:12:34 2012
> @@ -90,6 +90,16 @@
>                             Token &FirstToken);
>  };
>
> +class PragmaRedefineExtnameHandler : public PragmaHandler {
> +  Sema &Actions;
> +public:
> +  explicit PragmaRedefineExtnameHandler(Sema &A)
> +    : PragmaHandler("redefine_extname"), Actions(A) {}
> +
> +  virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind
> Introducer,
> +                            Token &FirstToken);
> +};
> +
>  class PragmaOpenCLExtensionHandler : public PragmaHandler {
>   Sema &Actions;
>   Parser &parser;
>
> Modified: cfe/trunk/lib/Parse/Parser.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/Parser.cpp?rev=150881&r1=150880&r2=150881&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Parse/Parser.cpp (original)
> +++ cfe/trunk/lib/Parse/Parser.cpp Sat Feb 18 10:12:34 2012
> @@ -64,6 +64,9 @@
>   WeakHandler.reset(new PragmaWeakHandler(actions));
>   PP.AddPragmaHandler(WeakHandler.get());
>
> +  RedefineExtnameHandler.reset(new PragmaRedefineExtnameHandler(actions));
> +  PP.AddPragmaHandler(RedefineExtnameHandler.get());
> +
>   FPContractHandler.reset(new PragmaFPContractHandler(actions, *this));
>   PP.AddPragmaHandler("STDC", FPContractHandler.get());
>
> @@ -382,6 +385,8 @@
>   UnusedHandler.reset();
>   PP.RemovePragmaHandler(WeakHandler.get());
>   WeakHandler.reset();
> +  PP.RemovePragmaHandler(RedefineExtnameHandler.get());
> +  RedefineExtnameHandler.reset();
>
>   if (getLang().OpenCL) {
>     PP.RemovePragmaHandler("OPENCL", OpenCLExtensionHandler.get());
>
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=150881&r1=150880&r2=150881&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Sat Feb 18 10:12:34 2012
> @@ -4059,6 +4059,13 @@
>
>     NewVD->addAttr(::new (Context) AsmLabelAttr(SE->getStrTokenLoc(0),
>                                                 Context, Label));
> +  } else if (!ExtnameUndeclaredIdentifiers.empty()) {
> +    llvm::DenseMap<IdentifierInfo*,AsmLabelAttr*>::iterator I =
> +      ExtnameUndeclaredIdentifiers.find(NewVD->getIdentifier());
> +    if (I != ExtnameUndeclaredIdentifiers.end()) {
> +      NewVD->addAttr(I->second);
> +      ExtnameUndeclaredIdentifiers.erase(I);
> +    }
>   }
>
>   // Diagnose shadowed variables before filtering for scope.
> @@ -5157,6 +5164,13 @@
>     StringLiteral *SE = cast<StringLiteral>(E);
>     NewFD->addAttr(::new (Context) AsmLabelAttr(SE->getStrTokenLoc(0),
> Context,
>                                                 SE->getString()));
> +  } else if (!ExtnameUndeclaredIdentifiers.empty()) {
> +    llvm::DenseMap<IdentifierInfo*,AsmLabelAttr*>::iterator I =
> +      ExtnameUndeclaredIdentifiers.find(NewFD->getIdentifier());
> +    if (I != ExtnameUndeclaredIdentifiers.end()) {
> +      NewFD->addAttr(I->second);
> +      ExtnameUndeclaredIdentifiers.erase(I);
> +    }
>   }
>
>   // Copy the parameter declarations from the declarator D to the function
> @@ -10152,6 +10166,24 @@
>   return Import;
>  }
>
> +void Sema::ActOnPragmaRedefineExtname(IdentifierInfo* Name,
> +                                      IdentifierInfo* AliasName,
> +                                      SourceLocation PragmaLoc,
> +                                      SourceLocation NameLoc,
> +                                      SourceLocation AliasNameLoc) {
> +  Decl *PrevDecl = LookupSingleName(TUScope, Name, NameLoc,
> +                                    LookupOrdinaryName);
> +  AsmLabelAttr *Attr =
> +     ::new (Context) AsmLabelAttr(AliasNameLoc, Context,
> AliasName->getName());
> +  fprintf(stderr, "Alias name: %s\n", AliasName->getName().str().c_str());
>

Uh, remove debugging code? =[


> +
> +  if (PrevDecl)
> +    PrevDecl->addAttr(Attr);
> +  else
> +    (void)ExtnameUndeclaredIdentifiers.insert(
> +      std::pair<IdentifierInfo*,AsmLabelAttr*>(Name, Attr));
> +}
> +
>  void Sema::ActOnPragmaWeakID(IdentifierInfo* Name,
>                              SourceLocation PragmaLoc,
>                              SourceLocation NameLoc) {
>
> Added: cfe/trunk/test/CodeGen/redefine_extname.c
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/redefine_extname.c?rev=150881&view=auto
>
> ==============================================================================
> --- cfe/trunk/test/CodeGen/redefine_extname.c (added)
> +++ cfe/trunk/test/CodeGen/redefine_extname.c Sat Feb 18 10:12:34 2012
> @@ -0,0 +1,15 @@
> +// RUN: %clang_cc1 -triple=i386-pc-solaris2.11 -w -emit-llvm %s -o - |
> FileCheck %s
> +
> +#pragma redefine_extname fake real
> +#pragma redefine_extname name alias
> +
> +extern int fake(void);
> +
> +int name;
> +
> +// __PRAGMA_REDEFINE_EXTNAME should be defined.  This will fail if it
> isn't...
>

Please test these independently; we have better places to check for
predefined macros, this test should focus exclusively on the desired
codegen changes.


> +int fish() { return fake() + __PRAGMA_REDEFINE_EXTNAME + name; }
> +// Check that the call to fake() is emitted as a call to real()
> +// CHECK:   call i32 @real()
> +// Check that this also works with variables names
> +// CHECK:   load i32* @alias
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20120218/eb38b682/attachment.html>


More information about the cfe-commits mailing list