From 6009db486e7fba448ccb28dff676c012efade8f0 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Wed, 26 Aug 2009 21:22:22 +0000 Subject: [PATCH] llvm-mc/Mach-O: Set .subsections_via_symbols flag properly. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@80144 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCAssembler.h | 10 ++++++++++ lib/MC/MCAssembler.cpp | 30 +++++++++++++++++++++--------- lib/MC/MCMachOStreamer.cpp | 9 ++++++++- test/MC/MachO/sections.s | 5 +++-- 4 files changed, 42 insertions(+), 12 deletions(-) diff --git a/include/llvm/MC/MCAssembler.h b/include/llvm/MC/MCAssembler.h index dc3f5c0f589..daa3ffe54da 100644 --- a/include/llvm/MC/MCAssembler.h +++ b/include/llvm/MC/MCAssembler.h @@ -496,6 +496,8 @@ private: std::vector IndirectSymbols; + unsigned SubsectionsViaSymbols : 1; + private: /// LayoutSection - Assign offsets and sizes to the fragments in the section /// \arg SD, and update the section size. The section file offset should @@ -521,6 +523,14 @@ public: /// Finish - Do final processing and write the object to the output stream. void Finish(); + // FIXME: This does not belong here. + bool getSubsectionsViaSymbols() const { + return SubsectionsViaSymbols; + } + void setSubsectionsViaSymbols(bool Value) { + SubsectionsViaSymbols = Value; + } + /// @name Section List Access /// @{ diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp index 1f62b060528..9efdfe359bb 100644 --- a/lib/MC/MCAssembler.cpp +++ b/lib/MC/MCAssembler.cpp @@ -48,6 +48,10 @@ class MachObjectWriter { HFT_Object = 0x1 }; + enum HeaderFlags { + HF_SubsectionsViaSymbols = 0x2000 + }; + enum LoadCommandType { LCT_Segment = 0x1, LCT_Symtab = 0x2, @@ -167,7 +171,13 @@ public: /// @} - void WriteHeader32(unsigned NumLoadCommands, unsigned LoadCommandsSize) { + void WriteHeader32(unsigned NumLoadCommands, unsigned LoadCommandsSize, + bool SubsectionsViaSymbols) { + uint32_t Flags = 0; + + if (SubsectionsViaSymbols) + Flags |= HF_SubsectionsViaSymbols; + // struct mach_header (28 bytes) uint64_t Start = OS.tell(); @@ -177,16 +187,13 @@ public: // FIXME: Support cputype. Write32(TargetMachOWriterInfo::HDR_CPU_TYPE_I386); - // FIXME: Support cpusubtype. Write32(TargetMachOWriterInfo::HDR_CPU_SUBTYPE_I386_ALL); - Write32(HFT_Object); - - // Object files have a single load command, the segment. - Write32(NumLoadCommands); + Write32(NumLoadCommands); // Object files have a single load command, the + // segment. Write32(LoadCommandsSize); - Write32(0); // Flags + Write32(Flags); assert(OS.tell() - Start == Header32Size); } @@ -674,7 +681,8 @@ public: } // Write the prolog, starting with the header and load command... - WriteHeader32(NumLoadCommands, LoadCommandsSize); + WriteHeader32(NumLoadCommands, LoadCommandsSize, + Asm.getSubsectionsViaSymbols()); WriteSegmentLoadCommand32(NumSections, SectionDataStart, SectionDataSize); // ... and then the section headers. @@ -864,7 +872,11 @@ MCSymbolData::MCSymbolData(MCSymbol &_Symbol, MCFragment *_Fragment, /* *** */ -MCAssembler::MCAssembler(raw_ostream &_OS) : OS(_OS) {} +MCAssembler::MCAssembler(raw_ostream &_OS) + : OS(_OS), + SubsectionsViaSymbols(false) +{ +} MCAssembler::~MCAssembler() { } diff --git a/lib/MC/MCMachOStreamer.cpp b/lib/MC/MCMachOStreamer.cpp index 4a888078833..ef5a99fb37a 100644 --- a/lib/MC/MCMachOStreamer.cpp +++ b/lib/MC/MCMachOStreamer.cpp @@ -159,7 +159,14 @@ void MCMachOStreamer::EmitLabel(MCSymbol *Symbol) { } void MCMachOStreamer::EmitAssemblerFlag(AssemblerFlag Flag) { - llvm_unreachable("FIXME: Not yet implemented!"); + switch (Flag) { + default: + llvm_unreachable("FIXME: Not yet implemented!"); + + case SubsectionsViaSymbols: + Assembler.setSubsectionsViaSymbols(true); + break; + } } void MCMachOStreamer::EmitAssignment(MCSymbol *Symbol, diff --git a/test/MC/MachO/sections.s b/test/MC/MachO/sections.s index 27d97826665..11a86a9226e 100644 --- a/test/MC/MachO/sections.s +++ b/test/MC/MachO/sections.s @@ -42,13 +42,14 @@ .objc_selector_strs - + .subsections_via_symbols + // CHECK: ('cputype', 7) // CHECK: ('cpusubtype', 3) // CHECK: ('filetype', 1) // CHECK: ('num_load_commands', 1) // CHECK: ('load_commands_size', 2436) -// CHECK: ('flag', 0) +// CHECK: ('flag', 8192) // CHECK: ('load_commands', [ // CHECK: # Load Command 0 // CHECK: (('command', 1) -- 2.34.1