Fix the asmprinter so that a globalvalue can specify an explicit alignment

smaller than the preferred alignment, but so that the target can actually
specify a minimum alignment if needed.  This fixes some objc protocol
failures Devang tracked down.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37373 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2007-05-31 18:57:45 +00:00
parent 4f3485c0da
commit 3a4205367d
3 changed files with 31 additions and 8 deletions

View File

@ -248,8 +248,18 @@ namespace llvm {
/// EmitAlignment - Emit an alignment directive to the specified power of
/// two boundary. For example, if you pass in 3 here, you will get an 8
/// byte alignment. If a global value is specified, and if that global has
/// an explicit alignment requested, it will override the alignment request.
void EmitAlignment(unsigned NumBits, const GlobalValue *GV = 0) const;
/// an explicit alignment requested, it will unconditionally override the
/// alignment request. However, if ForcedAlignBits is specified, this value
/// has final say: the ultimate alignment will be the max of ForcedAlignBits
/// and the alignment computed with NumBits and the global.
///
/// The algorithm is:
/// Align = NumBits;
/// if (GV && GV->hasalignment) Align = GV->getalignment();
/// Align = std::max(Align, ForcedAlignBits);
///
void EmitAlignment(unsigned NumBits, const GlobalValue *GV = 0,
unsigned ForcedAlignBits = 0) const;
protected:
/// EmitZeros - Emit a block of zeros.

View File

@ -605,12 +605,25 @@ void AsmPrinter::EmitString(const std::string &String) const {
//===----------------------------------------------------------------------===//
// EmitAlignment - Emit an alignment directive to the specified power of two.
// Use the maximum of the specified alignment and the alignment from the
// specified GlobalValue (if any).
void AsmPrinter::EmitAlignment(unsigned NumBits, const GlobalValue *GV) const {
// EmitAlignment - Emit an alignment directive to the specified power of
// two boundary. For example, if you pass in 3 here, you will get an 8
// byte alignment. If a global value is specified, and if that global has
// an explicit alignment requested, it will unconditionally override the
// alignment request. However, if ForcedAlignBits is specified, this value
// has final say: the ultimate alignment will be the max of ForcedAlignBits
// and the alignment computed with NumBits and the global.
//
// The algorithm is:
// Align = NumBits;
// if (GV && GV->hasalignment) Align = GV->getalignment();
// Align = std::max(Align, ForcedAlignBits);
//
void AsmPrinter::EmitAlignment(unsigned NumBits, const GlobalValue *GV,
unsigned ForcedAlignBits) const {
if (GV && GV->getAlignment())
NumBits = std::max(NumBits, Log2_32(GV->getAlignment()));
NumBits = Log2_32(GV->getAlignment());
NumBits = std::max(NumBits, ForcedAlignBits);
if (NumBits == 0) return; // No need to emit alignment.
if (TAI->getAlignmentIsInBytes()) NumBits = 1 << NumBits;
O << TAI->getAlignDirective() << NumBits << "\n";

View File

@ -218,7 +218,7 @@ bool ARMAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
O << VisibilityDirective << CurrentFnName << "\n";
if (AFI->isThumbFunction()) {
EmitAlignment(AFI->getAlign(), F);
EmitAlignment(1, F, AFI->getAlign());
O << "\t.code\t16\n";
O << "\t.thumb_func";
if (Subtarget->isTargetDarwin())