diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-08-21 23:30:15 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-08-21 23:30:15 +0000 |
commit | 67dfb1de236dada2cc019b665203d216e4441b43 (patch) | |
tree | 5cbb38cdd035445b229122619f35660b95c501ce | |
parent | e64061f6758d245a80354dadc0bbfde6e24ec6c1 (diff) | |
download | bcm5719-llvm-67dfb1de236dada2cc019b665203d216e4441b43.tar.gz bcm5719-llvm-67dfb1de236dada2cc019b665203d216e4441b43.zip |
llvm-mc: Improve handling of implicit alignment for magic section directives
(e.g., .objc_message_refs).
- Just emit a .align when we see the directive; this isn't exactly what 'as'
does but in practice it should be ok, at least for now. See FIXME.
llvm-svn: 79697
-rw-r--r-- | llvm/test/MC/MachO/sections.s | 27 | ||||
-rw-r--r-- | llvm/tools/llvm-mc/AsmParser.cpp | 13 |
2 files changed, 21 insertions, 19 deletions
diff --git a/llvm/test/MC/MachO/sections.s b/llvm/test/MC/MachO/sections.s index 7b7f9a1e43f..97716025801 100644 --- a/llvm/test/MC/MachO/sections.s +++ b/llvm/test/MC/MachO/sections.s @@ -121,8 +121,7 @@ // CHECK: ('address', 0) // CHECK: ('size', 0) // CHECK: ('offset', 2464) - // FIXME: We aren't setting alignment correctly yet. -// CHECX: ('alignment', 2) +// CHECK: ('alignment', 2) // CHECK: ('reloc_offset', 0) // CHECK: ('num_reloc', 0) // CHECK: ('flags', 0x3) @@ -135,8 +134,7 @@ // CHECK: ('address', 0) // CHECK: ('size', 0) // CHECK: ('offset', 2464) - // FIXME: We aren't setting alignment correctly yet. -// CHECX: ('alignment', 3) +// CHECK: ('alignment', 3) // CHECK: ('reloc_offset', 0) // CHECK: ('num_reloc', 0) // CHECK: ('flags', 0x4) @@ -149,8 +147,7 @@ // CHECK: ('address', 0) // CHECK: ('size', 0) // CHECK: ('offset', 2464) - // FIXME: We aren't setting alignment correctly yet. -// CHECX: ('alignment', 4) +// CHECK: ('alignment', 4) // CHECK: ('reloc_offset', 0) // CHECK: ('num_reloc', 0) // CHECK: ('flags', 0xe) @@ -241,8 +238,7 @@ // CHECK: ('address', 0) // CHECK: ('size', 0) // CHECK: ('offset', 2464) - // FIXME: We aren't setting alignment correctly yet. -// CHECX: ('alignment', 2) +// CHECK: ('alignment', 2) // CHECK: ('reloc_offset', 0) // CHECK: ('num_reloc', 0) // CHECK: ('flags', 0x6) @@ -255,8 +251,7 @@ // CHECK: ('address', 0) // CHECK: ('size', 0) // CHECK: ('offset', 2464) - // FIXME: We aren't setting alignment correctly yet. -// CHECX: ('alignment', 2) +// CHECK: ('alignment', 2) // CHECK: ('reloc_offset', 0) // CHECK: ('num_reloc', 0) // CHECK: ('flags', 0x7) @@ -282,8 +277,7 @@ // CHECK: ('address', 0) // CHECK: ('size', 0) // CHECK: ('offset', 2464) - // FIXME: We aren't setting alignment correctly yet. -// CHECX: ('alignment', 2) +// CHECK: ('alignment', 2) // CHECK: ('reloc_offset', 0) // CHECK: ('num_reloc', 0) // CHECK: ('flags', 0x9) @@ -296,8 +290,7 @@ // CHECK: ('address', 0) // CHECK: ('size', 0) // CHECK: ('offset', 2464) - // FIXME: We aren't setting alignment correctly yet. -// CHECX: ('alignment', 2) +// CHECK: ('alignment', 2) // CHECK: ('reloc_offset', 0) // CHECK: ('num_reloc', 0) // CHECK: ('flags', 0xa) @@ -427,8 +420,7 @@ // CHECK: ('address', 0) // CHECK: ('size', 0) // CHECK: ('offset', 2464) - // FIXME: We aren't setting alignment correctly yet. -// CHECX: ('alignment', 2) +// CHECK: ('alignment', 2) // CHECK: ('reloc_offset', 0) // CHECK: ('num_reloc', 0) // CHECK: ('flags', 0x10000005) @@ -441,8 +433,7 @@ // CHECK: ('address', 0) // CHECK: ('size', 0) // CHECK: ('offset', 2464) - // FIXME: We aren't setting alignment correctly yet. -// CHECX: ('alignment', 2) +// CHECK: ('alignment', 2) // CHECK: ('reloc_offset', 0) // CHECK: ('num_reloc', 0) // CHECK: ('flags', 0x10000005) diff --git a/llvm/tools/llvm-mc/AsmParser.cpp b/llvm/tools/llvm-mc/AsmParser.cpp index 9db0ac0351b..19781212976 100644 --- a/llvm/tools/llvm-mc/AsmParser.cpp +++ b/llvm/tools/llvm-mc/AsmParser.cpp @@ -794,13 +794,24 @@ bool AsmParser::ParseDirectiveSectionSwitch(const char *Segment, // FIXME: Arch specific. // FIXME: Cache this! - // FIXME: Handle the implicit alignment!! MCSection *S = 0; // Ctx.GetSection(Section); if (S == 0) S = MCSectionMachO::Create(Segment, Section, TAA, StubSize, SectionKind(), Ctx); Out.SwitchSection(S); + + // Set the implicit alignment, if any. + // + // FIXME: This isn't really what 'as' does; I think it just uses the implicit + // alignment on the section (e.g., if one manually inserts bytes into the + // section, then just issueing the section switch directive will not realign + // the section. However, this is arguably more reasonable behavior, and there + // is no good reason for someone to intentionally emit incorrectly sized + // values into the implicitly aligned sections. + if (Align) + Out.EmitValueToAlignment(Align, 0, 1, 0); + return false; } |