[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