forked from OSchip/llvm-project
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:
parent
f718110ae5
commit
28ec0cf86c
|
@ -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) {
|
||||||
|
|
|
@ -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());
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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?");
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue