aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2010-02-02 21:44:01 +0000
committerDaniel Dunbar <daniel@zuster.org>2010-02-02 21:44:01 +0000
commite1ec617c6abf0b9dc1eecbbfe483bda3bb2b7795 (patch)
tree27ae77e84a066e7e1f1d9ba44754a90c3238f3b9
parente0faa547059c8d10cf34e63ea26a994291116228 (diff)
downloadexternal_llvm-e1ec617c6abf0b9dc1eecbbfe483bda3bb2b7795.zip
external_llvm-e1ec617c6abf0b9dc1eecbbfe483bda3bb2b7795.tar.gz
external_llvm-e1ec617c6abf0b9dc1eecbbfe483bda3bb2b7795.tar.bz2
MC/Mach-O: Set SOME_INSTRUCTIONS bit for sections.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@95135 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/MC/MCAssembler.h9
-rw-r--r--lib/MC/MCAssembler.cpp9
-rw-r--r--lib/MC/MCMachOStreamer.cpp4
-rw-r--r--test/MC/MachO/section-flags.s14
4 files changed, 31 insertions, 5 deletions
diff --git a/include/llvm/MC/MCAssembler.h b/include/llvm/MC/MCAssembler.h
index be017bf..55696b0 100644
--- a/include/llvm/MC/MCAssembler.h
+++ b/include/llvm/MC/MCAssembler.h
@@ -348,7 +348,11 @@ private:
/// Fixups - The list of fixups in this section.
std::vector<Fixup> Fixups;
-
+
+ /// HasInstructions - Whether this section has had instructions emitted into
+ /// it.
+ unsigned HasInstructions : 1;
+
/// @}
public:
@@ -429,6 +433,9 @@ public:
}
void setFileSize(uint64_t Value) { FileSize = Value; }
+ bool hasInstructions() const { return HasInstructions; }
+ void setHasInstructions(bool Value) { HasInstructions = Value; }
+
/// @}
};
diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp
index 08943eb..c471a02 100644
--- a/lib/MC/MCAssembler.cpp
+++ b/lib/MC/MCAssembler.cpp
@@ -266,11 +266,15 @@ public:
Write32(SD.getSize()); // size
Write32(FileOffset);
+ unsigned Flags = Section.getTypeAndAttributes();
+ if (SD.hasInstructions())
+ Flags |= MCSectionMachO::S_ATTR_SOME_INSTRUCTIONS;
+
assert(isPowerOf2_32(SD.getAlignment()) && "Invalid alignment!");
Write32(Log2_32(SD.getAlignment()));
Write32(NumRelocations ? RelocationsStart : 0);
Write32(NumRelocations);
- Write32(Section.getTypeAndAttributes());
+ Write32(Flags);
Write32(0); // reserved1
Write32(Section.getStubSize()); // reserved2
@@ -901,7 +905,8 @@ MCSectionData::MCSectionData(const MCSection &_Section, MCAssembler *A)
Address(~UINT64_C(0)),
Size(~UINT64_C(0)),
FileSize(~UINT64_C(0)),
- LastFixupLookup(~0)
+ LastFixupLookup(~0),
+ HasInstructions(false)
{
if (A)
A->getSectionList().push_back(this);
diff --git a/lib/MC/MCMachOStreamer.cpp b/lib/MC/MCMachOStreamer.cpp
index 143793c..981eb72 100644
--- a/lib/MC/MCMachOStreamer.cpp
+++ b/lib/MC/MCMachOStreamer.cpp
@@ -362,8 +362,8 @@ void MCMachOStreamer::EmitInstruction(const MCInst &Inst) {
if (!Emitter)
llvm_unreachable("no code emitter available!");
- // FIXME: Emitting an instruction should cause S_ATTR_SOME_INSTRUCTIONS to
- // be set for the current section.
+ CurSectionData->setHasInstructions(true);
+
// FIXME: Relocations!
SmallString<256> Code;
raw_svector_ostream VecOS(Code);
diff --git a/test/MC/MachO/section-flags.s b/test/MC/MachO/section-flags.s
new file mode 100644
index 0000000..8ac1bbf
--- /dev/null
+++ b/test/MC/MachO/section-flags.s
@@ -0,0 +1,14 @@
+// RUN: llvm-mc -triple i386-apple-darwin9 %s -filetype=obj -o - | macho-dump | FileCheck %s
+//
+// CHECK: # Section 0
+// CHECK: 'section_name', '__text
+// CHECK: 'flags', 0x80000000
+// CHECK: # Section 1
+// CHECK: 'section_name', '__data
+// CHECK: 'flags', 0x400
+
+ .text
+
+ .data
+f0:
+ movl $0, %eax