[cfe-commits] r45156 - in /cfe/trunk: CodeGen/CGExpr.cpp CodeGen/CodeGenModule.cpp CodeGen/CodeGenModule.h test/CodeGen/globalinit.c
Chris Lattner
sabre at nondot.org
Tue Dec 18 00:16:44 PST 2007
Author: lattner
Date: Tue Dec 18 02:16:44 2007
New Revision: 45156
URL: http://llvm.org/viewvc/llvm-project?rev=45156&view=rev
Log:
local static vars are globals also. This fixes a testcase
reported by Seo.
Modified:
cfe/trunk/CodeGen/CGExpr.cpp
cfe/trunk/CodeGen/CodeGenModule.cpp
cfe/trunk/CodeGen/CodeGenModule.h
cfe/trunk/test/CodeGen/globalinit.c
Modified: cfe/trunk/CodeGen/CGExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/CodeGen/CGExpr.cpp?rev=45156&r1=45155&r2=45156&view=diff
==============================================================================
--- cfe/trunk/CodeGen/CGExpr.cpp (original)
+++ cfe/trunk/CodeGen/CGExpr.cpp Tue Dec 18 02:16:44 2007
@@ -273,7 +273,7 @@
} else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
return LValue::MakeAddr(CGM.GetAddrOfFunctionDecl(FD, false));
} else if (const FileVarDecl *FVD = dyn_cast<FileVarDecl>(D)) {
- return LValue::MakeAddr(CGM.GetAddrOfFileVarDecl(FVD, false));
+ return LValue::MakeAddr(CGM.GetAddrOfGlobalVar(FVD, false));
}
assert(0 && "Unimp declref");
//an invalid LValue, but the assert will
Modified: cfe/trunk/CodeGen/CodeGenModule.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/CodeGen/CodeGenModule.cpp?rev=45156&r1=45155&r2=45156&view=diff
==============================================================================
--- cfe/trunk/CodeGen/CodeGenModule.cpp (original)
+++ cfe/trunk/CodeGen/CodeGenModule.cpp Tue Dec 18 02:16:44 2007
@@ -113,8 +113,10 @@
return Entry = NewFn;
}
-llvm::Constant *CodeGenModule::GetAddrOfFileVarDecl(const FileVarDecl *D,
- bool isDefinition) {
+llvm::Constant *CodeGenModule::GetAddrOfGlobalVar(const VarDecl *D,
+ bool isDefinition) {
+ assert(D->hasGlobalStorage() && "Not a global variable");
+
// See if it is already in the map.
llvm::Constant *&Entry = GlobalDeclMap[D];
if (Entry) return Entry;
@@ -433,8 +435,8 @@
// The only thing that can have array type like this is a
// DeclRefExpr(FileVarDecl)?
const DeclRefExpr *DRE = cast<DeclRefExpr>(ICExpr->getSubExpr());
- const FileVarDecl *FVD = cast<FileVarDecl>(DRE->getDecl());
- llvm::Constant *C = CGM.GetAddrOfFileVarDecl(FVD, false);
+ const VarDecl *VD = cast<VarDecl>(DRE->getDecl());
+ llvm::Constant *C = CGM.GetAddrOfGlobalVar(VD, false);
assert(isa<llvm::PointerType>(C->getType()) &&
isa<llvm::ArrayType>(cast<llvm::PointerType>(C->getType())
->getElementType()));
@@ -486,7 +488,7 @@
// Get the global, forcing it to be a direct reference.
llvm::GlobalVariable *GV =
- cast<llvm::GlobalVariable>(GetAddrOfFileVarDecl(D, true));
+ cast<llvm::GlobalVariable>(GetAddrOfGlobalVar(D, true));
// Convert the initializer, or use zero if appropriate.
llvm::Constant *Init = 0;
Modified: cfe/trunk/CodeGen/CodeGenModule.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/CodeGen/CodeGenModule.h?rev=45156&r1=45155&r2=45156&view=diff
==============================================================================
--- cfe/trunk/CodeGen/CodeGenModule.h (original)
+++ cfe/trunk/CodeGen/CodeGenModule.h Tue Dec 18 02:16:44 2007
@@ -33,6 +33,7 @@
class Expr;
class Stmt;
class ValueDecl;
+ class VarDecl;
class FileVarDecl;
struct LangOptions;
class Diagnostic;
@@ -69,8 +70,7 @@
llvm::Constant *GetAddrOfFunctionDecl(const FunctionDecl *D,
bool isDefinition);
- llvm::Constant *GetAddrOfFileVarDecl(const FileVarDecl *D,
- bool isDefinition);
+ llvm::Constant *GetAddrOfGlobalVar(const VarDecl *D, bool isDefinition);
/// getBuiltinLibFunction - Given a builtin id for a function like
Modified: cfe/trunk/test/CodeGen/globalinit.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/globalinit.c?rev=45156&r1=45155&r2=45156&view=diff
==============================================================================
--- cfe/trunk/test/CodeGen/globalinit.c (original)
+++ cfe/trunk/test/CodeGen/globalinit.c Tue Dec 18 02:16:44 2007
@@ -19,3 +19,10 @@
char string[8] = "string"; // extend init
char string2[4] = "string"; // truncate init
+char *test(int c) {
+ static char buf[10];
+ static char *bufptr = buf;
+
+ return c ? buf : bufptr;
+}
+
More information about the cfe-commits
mailing list