Don't remove aggregate-typed module level constants before encoding functions

since functions may contain aggregate constants too.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73220 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Nick Lewycky 2009-06-12 05:20:12 +00:00
parent 084f7bf8a7
commit f7e498138f
4 changed files with 12 additions and 31 deletions

View File

@ -1308,16 +1308,6 @@ static void WriteModule(const Module *M, BitstreamWriter &Stream) {
// Emit constants.
WriteModuleConstants(VE, Stream);
// If we have any aggregate values in the value table, purge them - these can
// only be used to initialize global variables. Doing so makes the value
// namespace smaller for code in functions.
int NumNonAggregates = VE.PurgeAggregateValues();
if (NumNonAggregates != -1) {
SmallVector<unsigned, 1> Vals;
Vals.push_back(NumNonAggregates);
Stream.EmitRecord(bitc::MODULE_CODE_PURGEVALS, Vals);
}
// Emit function bodies.
for (Module::const_iterator I = M->begin(), E = M->end(); I != E; ++I)
if (!I->isDeclaration())

View File

@ -277,22 +277,6 @@ void ValueEnumerator::EnumerateAttributes(const AttrListPtr &PAL) {
}
/// PurgeAggregateValues - If there are any aggregate values at the end of the
/// value list, remove them and return the count of the remaining values. If
/// there are none, return -1.
int ValueEnumerator::PurgeAggregateValues() {
// If there are no aggregate values at the end of the list, return -1.
if (Values.empty() || Values.back().first->getType()->isSingleValueType())
return -1;
// Otherwise, remove aggregate values...
while (!Values.empty() && !Values.back().first->getType()->isSingleValueType())
Values.pop_back();
// ... and return the new size.
return Values.size();
}
void ValueEnumerator::incorporateFunction(const Function &F) {
NumModuleValues = Values.size();

View File

@ -99,11 +99,6 @@ public:
return Attributes;
}
/// PurgeAggregateValues - If there are any aggregate values at the end of the
/// value list, remove them and return the count of the remaining values. If
/// there are none, return -1.
int PurgeAggregateValues();
/// incorporateFunction/purgeFunction - If you'd like to deal with a function,
/// use these two methods to get its data into the ValueEnumerator!
///

View File

@ -0,0 +1,12 @@
; RUN: llvm-as < %s | llvm-dis -disable-output
; PR4373
@foo = weak global { i32 } zeroinitializer
@bar = weak global i32 0
define void @test() {
entry:
store { i32 } zeroinitializer, { i32 }* @foo
store i32 1, i32* @bar
ret void
}