For PR645:

Keep track of global constant and variable definitions for eventual use
in resolving conflicts between global and local symbol usage.

llvm-svn: 32234
This commit is contained in:
Reid Spencer 2006-12-05 19:18:29 +00:00
parent 844668d2ef
commit c77c7157f8
2 changed files with 19 additions and 4 deletions

View File

@ -60,6 +60,12 @@ struct TypeInfo {
void destroy() const { delete newTy; } void destroy() const { delete newTy; }
TypeInfo clone() const {
TypeInfo result = *this;
result.newTy = new std::string(*newTy);
return result;
}
Types getElementType() const { return elemTy; } Types getElementType() const { return elemTy; }
bool isSigned() const { bool isSigned() const {

View File

@ -39,6 +39,7 @@ typedef std::vector<TypeInfo> TypeVector;
static TypeVector EnumeratedTypes; static TypeVector EnumeratedTypes;
typedef std::map<std::string,TypeInfo> TypeMap; typedef std::map<std::string,TypeInfo> TypeMap;
static TypeMap NamedTypes; static TypeMap NamedTypes;
static TypeMap Globals;
void destroy(ValueList* VL) { void destroy(ValueList* VL) {
while (!VL->empty()) { while (!VL->empty()) {
@ -777,29 +778,37 @@ ConstPool : ConstPool OptAssign TYPE TypesV {
$$ = 0; $$ = 0;
} }
| ConstPool OptAssign OptLinkage GlobalType ConstVal GlobalVarAttributes { | ConstPool OptAssign OptLinkage GlobalType ConstVal GlobalVarAttributes {
if (!$2->empty()) if (!$2->empty()) {
*O << *$2 << " = "; *O << *$2 << " = ";
Globals[*$2] = $5.type.clone();
}
*O << *$3 << " " << *$4 << " " << *$5.cnst << " " << *$6 << "\n"; *O << *$3 << " " << *$4 << " " << *$5.cnst << " " << *$6 << "\n";
delete $2; delete $3; delete $4; $5.destroy(); delete $6; delete $2; delete $3; delete $4; $5.destroy(); delete $6;
$$ = 0; $$ = 0;
} }
| ConstPool OptAssign External GlobalType Types GlobalVarAttributes { | ConstPool OptAssign External GlobalType Types GlobalVarAttributes {
if (!$2->empty()) if (!$2->empty()) {
*O << *$2 << " = "; *O << *$2 << " = ";
Globals[*$2] = $5.clone();
}
*O << *$3 << " " << *$4 << " " << *$5.newTy << " " << *$6 << "\n"; *O << *$3 << " " << *$4 << " " << *$5.newTy << " " << *$6 << "\n";
delete $2; delete $3; delete $4; $5.destroy(); delete $6; delete $2; delete $3; delete $4; $5.destroy(); delete $6;
$$ = 0; $$ = 0;
} }
| ConstPool OptAssign DLLIMPORT GlobalType Types GlobalVarAttributes { | ConstPool OptAssign DLLIMPORT GlobalType Types GlobalVarAttributes {
if (!$2->empty()) if (!$2->empty()) {
*O << *$2 << " = "; *O << *$2 << " = ";
Globals[*$2] = $5.clone();
}
*O << *$3 << " " << *$4 << " " << *$5.newTy << " " << *$6 << "\n"; *O << *$3 << " " << *$4 << " " << *$5.newTy << " " << *$6 << "\n";
delete $2; delete $3; delete $4; $5.destroy(); delete $6; delete $2; delete $3; delete $4; $5.destroy(); delete $6;
$$ = 0; $$ = 0;
} }
| ConstPool OptAssign EXTERN_WEAK GlobalType Types GlobalVarAttributes { | ConstPool OptAssign EXTERN_WEAK GlobalType Types GlobalVarAttributes {
if (!$2->empty()) if (!$2->empty()) {
*O << *$2 << " = "; *O << *$2 << " = ";
Globals[*$2] = $5.clone();
}
*O << *$3 << " " << *$4 << " " << *$5.newTy << " " << *$6 << "\n"; *O << *$3 << " " << *$4 << " " << *$5.newTy << " " << *$6 << "\n";
delete $2; delete $3; delete $4; $5.destroy(); delete $6; delete $2; delete $3; delete $4; $5.destroy(); delete $6;
$$ = 0; $$ = 0;