[cfe-commits] r77660 - in /cfe/trunk/lib/Sema: ParseAST.cpp Sema.h SemaDecl.cpp SemaDeclAttr.cpp
Daniel Dunbar
daniel at zuster.org
Fri Jul 31 16:51:12 PDT 2009
Hi Ryan,
This should have a test case?
It would be nice to see the test case verify things like collision of
a user defined variable / function with the one generated by pragma
weak, and a basic check for codegen.
- Daniel
On Thu, Jul 30, 2009 at 7:52 PM, Ryan Flynn<pizza at parseerror.com> wrote:
> Author: pizza
> Date: Thu Jul 30 21:52:19 2009
> New Revision: 77660
>
> URL: http://llvm.org/viewvc/llvm-project?rev=77660&view=rev
> Log:
> PR3679 - enable #pragma weak aliasing.
>
> Modified:
> cfe/trunk/lib/Sema/ParseAST.cpp
> cfe/trunk/lib/Sema/Sema.h
> cfe/trunk/lib/Sema/SemaDecl.cpp
> cfe/trunk/lib/Sema/SemaDeclAttr.cpp
>
> Modified: cfe/trunk/lib/Sema/ParseAST.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/ParseAST.cpp?rev=77660&r1=77659&r2=77660&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/ParseAST.cpp (original)
> +++ cfe/trunk/lib/Sema/ParseAST.cpp Thu Jul 30 21:52:19 2009
> @@ -68,6 +68,12 @@
> Consumer->HandleTopLevelDecl(ADecl.getAsVal<DeclGroupRef>());
> };
>
> + // process any TopLevelDecls generated by #pragma weak
> + for (llvm::SmallVector<Decl*,2>::iterator
> + I = S.WeakTopLevelDecls().begin(),
> + E = S.WeakTopLevelDecls().end(); I != E; ++I)
> + Consumer->HandleTopLevelDecl(DeclGroupRef(*I));
> +
> Consumer->HandleTranslationUnit(Ctx);
>
> if (PrintStats) {
>
> Modified: cfe/trunk/lib/Sema/Sema.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=77660&r1=77659&r2=77660&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/Sema.h (original)
> +++ cfe/trunk/lib/Sema/Sema.h Thu Jul 30 21:52:19 2009
> @@ -254,6 +254,13 @@
> };
> llvm::DenseMap<IdentifierInfo*,WeakInfo> WeakUndeclaredIdentifiers;
>
> + /// WeakTopLevelDecl - Translation-unit scoped declarations generated by
> + /// #pragma weak during processing of other Decls.
> + /// I couldn't figure out a clean way to generate these in-line, so
> + /// we store them here and handle separately -- which is a hack.
> + /// It would be best to refactor this.
> + llvm::SmallVector<Decl*,2> WeakTopLevelDecl;
> +
> IdentifierResolver IdResolver;
>
> /// Translation Unit Scope - useful to Objective-C actions that need
> @@ -381,6 +388,9 @@
> llvm::SmallVector<SwitchStmt*,8> &getSwitchStack() {
> return CurBlock ? CurBlock->SwitchStack : FunctionSwitchStack;
> }
> +
> + /// WeakTopLevelDeclDecls - access to #pragma weak-generated Decls
> + llvm::SmallVector<Decl*,2> &WeakTopLevelDecls() { return WeakTopLevelDecl; }
>
> virtual void ActOnComment(SourceRange Comment);
>
> @@ -2948,7 +2958,8 @@
> SourceLocation LParenLoc,
> SourceLocation RParenLoc);
>
> - void DeclApplyPragmaWeak(NamedDecl *D, WeakInfo &W);
> + NamedDecl *DeclClonePragmaWeak(NamedDecl *ND, IdentifierInfo *II);
> + void DeclApplyPragmaWeak(Scope *S, NamedDecl *ND, WeakInfo &W);
>
> /// ActOnPragmaWeakID - Called on well formed #pragma weak ident.
> virtual void ActOnPragmaWeakID(IdentifierInfo* WeakName,
>
> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=77660&r1=77659&r2=77660&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Thu Jul 30 21:52:19 2009
> @@ -5220,7 +5220,7 @@
> if (PrevDecl) {
> if (!PrevDecl->hasAttr<AliasAttr>())
> if (NamedDecl *ND = dyn_cast<NamedDecl>(PrevDecl))
> - DeclApplyPragmaWeak(ND, W);
> + DeclApplyPragmaWeak(TUScope, ND, W);
> } else {
> (void)WeakUndeclaredIdentifiers.insert(
> std::pair<IdentifierInfo*,WeakInfo>(AliasName, W));
>
> Modified: cfe/trunk/lib/Sema/SemaDeclAttr.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclAttr.cpp?rev=77660&r1=77659&r2=77660&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaDeclAttr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaDeclAttr.cpp Thu Jul 30 21:52:19 2009
> @@ -1820,8 +1820,9 @@
>
> /// DeclClonePragmaWeak - clone existing decl (maybe definition),
> /// #pragma weak needs a non-definition decl and source may not have one
> -static NamedDecl * DeclClonePragmaWeak(NamedDecl *ND, IdentifierInfo *II)
> +NamedDecl * Sema::DeclClonePragmaWeak(NamedDecl *ND, IdentifierInfo *II)
> {
> + assert(isa<FunctionDecl>(ND) || isa<VarDecl>(ND));
> NamedDecl *NewD = 0;
> if (FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)) {
> NewD = FunctionDecl::Create(FD->getASTContext(), FD->getDeclContext(),
> @@ -1837,8 +1838,7 @@
>
> /// DeclApplyPragmaWeak - A declaration (maybe definition) needs #pragma weak
> /// applied to it, possibly with an alias.
> -void Sema::DeclApplyPragmaWeak(NamedDecl *ND, WeakInfo &W) {
> - assert(isa<FunctionDecl>(ND) || isa<VarDecl>(ND));
> +void Sema::DeclApplyPragmaWeak(Scope *S, NamedDecl *ND, WeakInfo &W) {
> if (!W.getUsed()) { // only do this once
> W.setUsed(true);
> if (W.getAlias()) { // clone decl, impersonate __attribute(weak,alias(...))
> @@ -1846,7 +1846,13 @@
> NamedDecl *NewD = DeclClonePragmaWeak(ND, W.getAlias());
> NewD->addAttr(::new (Context) AliasAttr(NDId->getName()));
> NewD->addAttr(::new (Context) WeakAttr());
> - ND->getDeclContext()->addDecl(NewD);
> + WeakTopLevelDecl.push_back(NewD);
> + // FIXME: "hideous" code from Sema::LazilyCreateBuiltin
> + // to insert Decl at TU scope, sorry.
> + DeclContext *SavedContext = CurContext;
> + CurContext = Context.getTranslationUnitDecl();
> + PushOnScopeChains(NewD, S);
> + CurContext = SavedContext;
> } else { // just add weak to existing
> ND->addAttr(::new (Context) WeakAttr());
> }
> @@ -1862,8 +1868,8 @@
> if (ND->hasLinkage()) {
> WeakInfo W = WeakUndeclaredIdentifiers.lookup(ND->getIdentifier());
> if (W != WeakInfo()) {
> - // Declaration referenced by #pragma weak before it was declared
> - DeclApplyPragmaWeak(ND, W);
> + // Identifier referenced by #pragma weak before it was declared
> + DeclApplyPragmaWeak(S, ND, W);
> WeakUndeclaredIdentifiers[ND->getIdentifier()] = W;
> }
> }
>
>
> _______________________________________________
> 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