the logic for computing __func__ and friends is really broken:

the type assigned by sema (and is visible with sizeof(__func__) for
example) has nothing to do with what codegen ends up producing.
We should eventually add a method on PredefinedExpr to handle this.
In the meantime, just set up some framework and add some fixme's.

llvm-svn: 69872
This commit is contained in:
Chris Lattner 2009-04-23 05:30:27 +00:00
parent f718110ae5
commit 28ec0cf86c
5 changed files with 16 additions and 6 deletions

View File

@ -376,6 +376,11 @@ public:
SourceLocation getLocation() const { return Loc; } SourceLocation getLocation() const { return Loc; }
void setLocation(SourceLocation L) { Loc = L; } void setLocation(SourceLocation L) { Loc = L; }
// FIXME: The logic for computing the value of a predefined expr should go
// into a method here that takes the inner-most code decl (a block, function
// or objc method) that the expr lives in. This would allow sema and codegen
// to be consistent for things like sizeof(__func__) etc.
virtual SourceRange getSourceRange() const { return SourceRange(Loc); } virtual SourceRange getSourceRange() const { return SourceRange(Loc); }
static bool classof(const Stmt *T) { static bool classof(const Stmt *T) {

View File

@ -672,9 +672,9 @@ CodeGenFunction::GenerateBlockFunction(const BlockExpr *BExpr,
CGM.SetInternalFunctionAttributes(BD, Fn, FI); CGM.SetInternalFunctionAttributes(BD, Fn, FI);
StartFunction(BD, ResultType, Fn, Args, StartFunction(OuterFuncDecl, ResultType, Fn, Args,
BExpr->getBody()->getLocEnd()); BExpr->getBody()->getLocEnd());
CurFuncDecl = OuterFuncDecl; CurCodeDecl = BD;
EmitStmt(BExpr->getBody()); EmitStmt(BExpr->getBody());
FinishFunction(cast<CompoundStmt>(BExpr->getBody())->getRBracLoc()); FinishFunction(cast<CompoundStmt>(BExpr->getBody())->getRBracLoc());

View File

@ -752,8 +752,11 @@ LValue CodeGenFunction::EmitPredefinedFunctionName(unsigned Type) {
break; break;
} }
// FIXME: This isn't right at all. The logic for computing this should go
// into a method on PredefinedExpr. This would allow sema and codegen to be
// consistent for things like sizeof(__func__) etc.
std::string FunctionName; std::string FunctionName;
if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(CurFuncDecl)) { if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(CurCodeDecl)) {
FunctionName = CGM.getMangledName(FD); FunctionName = CGM.getMangledName(FD);
} else { } else {
// Just get the mangled name; skipping the asm prefix if it // Just get the mangled name; skipping the asm prefix if it

View File

@ -145,7 +145,7 @@ void CodeGenFunction::StartFunction(const Decl *D, QualType RetTy,
const FunctionArgList &Args, const FunctionArgList &Args,
SourceLocation StartLoc) { SourceLocation StartLoc) {
DidCallStackSave = false; DidCallStackSave = false;
CurFuncDecl = D; CurCodeDecl = CurFuncDecl = D;
FnRetTy = RetTy; FnRetTy = RetTy;
CurFn = Fn; CurFn = Fn;
assert(CurFn->isDeclaration() && "Function already has body?"); assert(CurFn->isDeclaration() && "Function already has body?");

View File

@ -70,9 +70,11 @@ public:
typedef std::pair<llvm::Value *, llvm::Value *> ComplexPairTy; typedef std::pair<llvm::Value *, llvm::Value *> ComplexPairTy;
CGBuilderTy Builder; CGBuilderTy Builder;
/// CurFuncDecl - Holds the Decl for the current function or method. This /// CurFuncDecl - Holds the Decl for the current function or ObjC method.
/// excludes BlockDecls. /// This excludes BlockDecls.
const Decl *CurFuncDecl; const Decl *CurFuncDecl;
/// CurCodeDecl - This is the inner-most code context, which includes blocks.
const Decl *CurCodeDecl;
const CGFunctionInfo *CurFnInfo; const CGFunctionInfo *CurFnInfo;
QualType FnRetTy; QualType FnRetTy;
llvm::Function *CurFn; llvm::Function *CurFn;