mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-07 14:33:15 +00:00
Fix padding for variables allocated on stack.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1969 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c941b87397
commit
e4e4d4e2f9
@ -134,49 +134,54 @@ MachineCodeForMethod::MachineCodeForMethod(const Method* _M,
|
||||
int
|
||||
MachineCodeForMethod::computeOffsetforLocalVar(const TargetMachine& target,
|
||||
const Value* val,
|
||||
unsigned int size)
|
||||
unsigned int& getPaddedSize,
|
||||
unsigned int sizeToUse = 0)
|
||||
{
|
||||
bool growUp;
|
||||
int firstOffset =target.getFrameInfo().getFirstAutomaticVarOffset(*this,
|
||||
growUp);
|
||||
unsigned char align;
|
||||
if (size == 0)
|
||||
if (sizeToUse == 0)
|
||||
{
|
||||
size = target.findOptimalStorageSize(val->getType());
|
||||
sizeToUse = target.findOptimalStorageSize(val->getType());
|
||||
// align = target.DataLayout.getTypeAlignment(val->getType());
|
||||
}
|
||||
|
||||
align = SizeToAlignment(size, target);
|
||||
|
||||
align = SizeToAlignment(sizeToUse, target);
|
||||
|
||||
int offset = getAutomaticVarsSize();
|
||||
if (! growUp)
|
||||
offset += size;
|
||||
offset += sizeToUse;
|
||||
|
||||
if (unsigned int mod = offset % align)
|
||||
{
|
||||
offset += align - mod;
|
||||
size += align - mod;
|
||||
offset += align - mod;
|
||||
getPaddedSize = sizeToUse + align - mod;
|
||||
}
|
||||
|
||||
else
|
||||
getPaddedSize = sizeToUse;
|
||||
|
||||
offset = growUp? firstOffset + offset
|
||||
: firstOffset - offset;
|
||||
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
int
|
||||
MachineCodeForMethod::allocateLocalVar(const TargetMachine& target,
|
||||
const Value* val,
|
||||
unsigned int size)
|
||||
unsigned int sizeToUse = 0)
|
||||
{
|
||||
// Check if we've allocated a stack slot for this value already
|
||||
//
|
||||
int offset = getOffset(val);
|
||||
if (offset == INVALID_FRAME_OFFSET)
|
||||
{
|
||||
offset = this->computeOffsetforLocalVar(target, val, size);
|
||||
unsigned int getPaddedSize;
|
||||
offset = this->computeOffsetforLocalVar(target, val, getPaddedSize,
|
||||
sizeToUse);
|
||||
offsets[val] = offset;
|
||||
incrementAutomaticVarsSize(size);
|
||||
incrementAutomaticVarsSize(getPaddedSize);
|
||||
}
|
||||
return offset;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user