On Sat, Feb 18, 2012 at 8:12 AM, David Chisnall <[email protected]> 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 > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
