[llvm-commits] [llvm] r157062 - in /llvm/trunk: include/llvm/MC/ include/llvm/Object/ lib/CodeGen/AsmPrinter/ lib/MC/ lib/MC/MCParser/ lib/Object/ lib/Target/ARM/ lib/Target/ARM/MCTargetDesc/ lib/Target/X86/ test/CodeGen/ARM/ test/CodeGen/Thumb2/

Alexander Potapenko glider at google.com
Wed May 23 05:19:37 PDT 2012


Hi Jim,

Turns out that these load commands are unsupported by otool and ar on
OS X 10.7 (and possibly 10.6), see
http://llvm.org/bugs/show_bug.cgi?id=12918
This leads to problems with building compiler-rt on OS X

My Xcode version is 4.2, although I don't know if otool and ar are
provided by xcode.

On Fri, May 18, 2012 at 11:12 PM, Jim Grosbach <grosbach at apple.com> wrote:
> Author: grosbach
> Date: Fri May 18 14:12:01 2012
> New Revision: 157062
>
> URL: http://llvm.org/viewvc/llvm-project?rev=157062&view=rev
> Log:
> Refactor data-in-code annotations.
>
> Use a dedicated MachO load command to annotate data-in-code regions.
> This is the same format the linker produces for final executable images,
> allowing consistency of representation and use of introspection tools
> for both object and executable files.
>
> Data-in-code regions are annotated via ".data_region"/".end_data_region"
> directive pairs, with an optional region type.
>
> data_region_directive := ".data_region" { region_type }
> region_type := "jt8" | "jt16" | "jt32" | "jta32"
> end_data_region_directive := ".end_data_region"
>
> The previous handling of ARM-style "$d.*" labels was broken and has
> been removed. Specifically, it didn't handle ARM vs. Thumb mode when
> marking the end of the section.
>
> rdar://11459456
>
> Added:
>    llvm/trunk/test/CodeGen/ARM/data-in-code-annotations.ll
>    llvm/trunk/test/MC/MachO/ARM/data-in-code.s
> Modified:
>    llvm/trunk/include/llvm/MC/MCAsmInfo.h
>    llvm/trunk/include/llvm/MC/MCAssembler.h
>    llvm/trunk/include/llvm/MC/MCContext.h
>    llvm/trunk/include/llvm/MC/MCDirectives.h
>    llvm/trunk/include/llvm/MC/MCMachObjectWriter.h
>    llvm/trunk/include/llvm/MC/MCStreamer.h
>    llvm/trunk/include/llvm/Object/MachOFormat.h
>    llvm/trunk/include/llvm/Object/MachOObject.h
>    llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
>    llvm/trunk/lib/MC/MCAsmInfo.cpp
>    llvm/trunk/lib/MC/MCAsmInfoCOFF.cpp
>    llvm/trunk/lib/MC/MCAsmInfoDarwin.cpp
>    llvm/trunk/lib/MC/MCAsmStreamer.cpp
>    llvm/trunk/lib/MC/MCELFStreamer.cpp
>    llvm/trunk/lib/MC/MCMachOStreamer.cpp
>    llvm/trunk/lib/MC/MCParser/DarwinAsmParser.cpp
>    llvm/trunk/lib/MC/MCStreamer.cpp
>    llvm/trunk/lib/MC/MachObjectWriter.cpp
>    llvm/trunk/lib/Object/MachOObject.cpp
>    llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp
>    llvm/trunk/lib/Target/ARM/ARMAsmPrinter.h
>    llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMCAsmInfo.cpp
>    llvm/trunk/lib/Target/X86/X86MCInstLower.cpp
>    llvm/trunk/test/CodeGen/Thumb2/thumb2-tbb.ll
>    llvm/trunk/test/MC/ARM/elf-reloc-01.ll
>    llvm/trunk/tools/macho-dump/macho-dump.cpp
>
> Modified: llvm/trunk/include/llvm/MC/MCAsmInfo.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCAsmInfo.h?rev=157062&r1=157061&r2=157062&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCAsmInfo.h (original)
> +++ llvm/trunk/include/llvm/MC/MCAsmInfo.h Fri May 18 14:12:01 2012
> @@ -147,6 +147,11 @@
>     // FIXME: Make this a more general encoding setting?
>     bool AllowUTF8;
>
> +    /// UseDataRegionDirectives - This is true if data region markers should
> +    /// be printed as ".data_region/.end_data_region" directives. If false,
> +    /// use "$d/$a" labels instead.
> +    bool UseDataRegionDirectives;
> +
>     //===--- Data Emission Directives -------------------------------------===//
>
>     /// ZeroDirective - this should be set to the directive used to get some
> @@ -172,18 +177,6 @@
>     const char *Data32bitsDirective;         // Defaults to "\t.long\t"
>     const char *Data64bitsDirective;         // Defaults to "\t.quad\t"
>
> -    /// [Data|Code]Begin - These magic labels are used to marked a region as
> -    /// data or code, and are used to provide additional information for
> -    /// correct disassembly on targets that like to mix data and code within
> -    /// a segment.  These labels will be implicitly suffixed by the streamer
> -    /// to give them unique names.
> -    const char *DataBegin;                   // Defaults to "$d."
> -    const char *CodeBegin;                   // Defaults to "$a."
> -    const char *JT8Begin;                    // Defaults to "$a."
> -    const char *JT16Begin;                   // Defaults to "$a."
> -    const char *JT32Begin;                   // Defaults to "$a."
> -    bool SupportsDataRegions;
> -
>     /// GPRel64Directive - if non-null, a directive that is used to emit a word
>     /// which should be relocated as a 64-bit GP-relative offset, e.g. .gpdword
>     /// on Mips.
> @@ -384,14 +377,6 @@
>     const char *getGPRel64Directive() const { return GPRel64Directive; }
>     const char *getGPRel32Directive() const { return GPRel32Directive; }
>
> -    /// [Code|Data]Begin label name accessors.
> -    const char *getCodeBeginLabelName() const { return CodeBegin; }
> -    const char *getDataBeginLabelName() const { return DataBegin; }
> -    const char *getJumpTable8BeginLabelName() const { return JT8Begin; }
> -    const char *getJumpTable16BeginLabelName() const { return JT16Begin; }
> -    const char *getJumpTable32BeginLabelName() const { return JT32Begin; }
> -    bool getSupportsDataRegions() const { return SupportsDataRegions; }
> -
>     /// getNonexecutableStackSection - Targets can implement this method to
>     /// specify a section to switch to if the translation unit doesn't have any
>     /// trampolines that require an executable stack.
> @@ -488,6 +473,9 @@
>     bool doesAllowUTF8() const {
>       return AllowUTF8;
>     }
> +    bool doesSupportDataRegionDirectives() const {
> +      return UseDataRegionDirectives;
> +    }
>     const char *getZeroDirective() const {
>       return ZeroDirective;
>     }
>
> Modified: llvm/trunk/include/llvm/MC/MCAssembler.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCAssembler.h?rev=157062&r1=157061&r2=157062&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCAssembler.h (original)
> +++ llvm/trunk/include/llvm/MC/MCAssembler.h Fri May 18 14:12:01 2012
> @@ -651,6 +651,16 @@
>   MCSectionData *SectionData;
>  };
>
> +// FIXME: Ditto this. Purely so the Streamer and the ObjectWriter can talk
> +// to one another.
> +struct DataRegionData {
> +  // This enum should be kept in sync w/ the mach-o definition in
> +  // llvm/Object/MachOFormat.h.
> +  enum KindTy { Data = 1, JumpTable8, JumpTable16, JumpTable32 } Kind;
> +  MCSymbol *Start;
> +  MCSymbol *End;
> +};
> +
>  class MCAssembler {
>   friend class MCAsmLayout;
>
> @@ -668,6 +678,10 @@
>     const_indirect_symbol_iterator;
>   typedef std::vector<IndirectSymbolData>::iterator indirect_symbol_iterator;
>
> +  typedef std::vector<DataRegionData>::const_iterator
> +    const_data_region_iterator;
> +  typedef std::vector<DataRegionData>::iterator data_region_iterator;
> +
>  private:
>   MCAssembler(const MCAssembler&);    // DO NOT IMPLEMENT
>   void operator=(const MCAssembler&); // DO NOT IMPLEMENT
> @@ -698,6 +712,7 @@
>
>   std::vector<IndirectSymbolData> IndirectSymbols;
>
> +  std::vector<DataRegionData> DataRegions;
>   /// The set of function symbols for which a .thumb_func directive has
>   /// been seen.
>   //
> @@ -884,6 +899,33 @@
>   size_t indirect_symbol_size() const { return IndirectSymbols.size(); }
>
>   /// @}
> +  /// @name Data Region List Access
> +  /// @{
> +
> +  // FIXME: This is a total hack, this should not be here. Once things are
> +  // factored so that the streamer has direct access to the .o writer, it can
> +  // disappear.
> +  std::vector<DataRegionData> &getDataRegions() {
> +    return DataRegions;
> +  }
> +
> +  data_region_iterator data_region_begin() {
> +    return DataRegions.begin();
> +  }
> +  const_data_region_iterator data_region_begin() const {
> +    return DataRegions.begin();
> +  }
> +
> +  data_region_iterator data_region_end() {
> +    return DataRegions.end();
> +  }
> +  const_data_region_iterator data_region_end() const {
> +    return DataRegions.end();
> +  }
> +
> +  size_t data_region_size() const { return DataRegions.size(); }
> +
> +  /// @}
>   /// @name Backend Data Access
>   /// @{
>
>
> Modified: llvm/trunk/include/llvm/MC/MCContext.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCContext.h?rev=157062&r1=157061&r2=157062&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCContext.h (original)
> +++ llvm/trunk/include/llvm/MC/MCContext.h Fri May 18 14:12:01 2012
> @@ -161,6 +161,10 @@
>     /// with a unique but unspecified name.
>     MCSymbol *CreateTempSymbol();
>
> +    /// getUniqueSymbolID() - Return a unique identifier for use in constructing
> +    /// symbol names.
> +    unsigned getUniqueSymbolID() { return NextUniqueID++; }
> +
>     /// CreateDirectionalLocalSymbol - Create the definition of a directional
>     /// local symbol for numbered label (used for "1:" definitions).
>     MCSymbol *CreateDirectionalLocalSymbol(int64_t LocalLabelVal);
>
> Modified: llvm/trunk/include/llvm/MC/MCDirectives.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCDirectives.h?rev=157062&r1=157061&r2=157062&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCDirectives.h (original)
> +++ llvm/trunk/include/llvm/MC/MCDirectives.h Fri May 18 14:12:01 2012
> @@ -52,6 +52,14 @@
>   MCAF_Code64                 ///< .code64 (X86)
>  };
>
> +enum MCDataRegionType {
> +  MCDR_DataRegion,            ///< .data_region
> +  MCDR_DataRegionJT8,         ///< .data_region jt8
> +  MCDR_DataRegionJT16,        ///< .data_region jt16
> +  MCDR_DataRegionJT32,        ///< .data_region jt32
> +  MCDR_DataRegionEnd          ///< .end_data_region
> +};
> +
>  } // end namespace llvm
>
>  #endif
>
> Modified: llvm/trunk/include/llvm/MC/MCMachObjectWriter.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCMachObjectWriter.h?rev=157062&r1=157061&r2=157062&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCMachObjectWriter.h (original)
> +++ llvm/trunk/include/llvm/MC/MCMachObjectWriter.h Fri May 18 14:12:01 2012
> @@ -179,6 +179,9 @@
>
>   void WriteNlist(MachSymbolData &MSD, const MCAsmLayout &Layout);
>
> +  void WriteLinkeditLoadCommand(uint32_t Type, uint32_t DataOffset,
> +                                uint32_t DataSize);
> +
>   // FIXME: We really need to improve the relocation validation. Basically, we
>   // want to implement a separate computation which evaluates the relocation
>   // entry as the linker would, and verifies that the resultant fixup value is
>
> Modified: llvm/trunk/include/llvm/MC/MCStreamer.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCStreamer.h?rev=157062&r1=157061&r2=157062&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCStreamer.h (original)
> +++ llvm/trunk/include/llvm/MC/MCStreamer.h Fri May 18 14:12:01 2012
> @@ -69,22 +69,7 @@
>     SmallVector<std::pair<const MCSection *,
>                 const MCSection *>, 4> SectionStack;
>
> -    unsigned UniqueCodeBeginSuffix;
> -    unsigned UniqueDataBeginSuffix;
> -
>   protected:
> -    /// Indicator of whether the previous data-or-code indicator was for
> -    /// code or not.  Used to determine when we need to emit a new indicator.
> -    enum DataType {
> -      Data,
> -      Code,
> -      JumpTable8,
> -      JumpTable16,
> -      JumpTable32
> -    };
> -    DataType RegionIndicator;
> -
> -
>     MCStreamer(MCContext &Ctx);
>
>     const MCExpr *BuildSymbolDiff(MCContext &Context, const MCSymbol *A,
> @@ -241,47 +226,15 @@
>     /// used in an assignment.
>     virtual void EmitLabel(MCSymbol *Symbol);
>
> -    /// EmitDataRegion - Emit a label that marks the beginning of a data
> -    /// region.
> -    /// On ELF targets, this corresponds to an assembler statement such as:
> -    ///   $d.1:
> -    virtual void EmitDataRegion();
> -
> -    /// EmitJumpTable8Region - Emit a label that marks the beginning of a
> -    /// jump table composed of 8-bit offsets.
> -    /// On ELF targets, this corresponds to an assembler statement such as:
> -    ///   $d.1:
> -    virtual void EmitJumpTable8Region();
> -
> -    /// EmitJumpTable16Region - Emit a label that marks the beginning of a
> -    /// jump table composed of 16-bit offsets.
> -    /// On ELF targets, this corresponds to an assembler statement such as:
> -    ///   $d.1:
> -    virtual void EmitJumpTable16Region();
> -
> -    /// EmitJumpTable32Region - Emit a label that marks the beginning of a
> -    /// jump table composed of 32-bit offsets.
> -    /// On ELF targets, this corresponds to an assembler statement such as:
> -    ///   $d.1:
> -    virtual void EmitJumpTable32Region();
> -
> -    /// EmitCodeRegion - Emit a label that marks the beginning of a code
> -    /// region.
> -    /// On ELF targets, this corresponds to an assembler statement such as:
> -    ///   $a.1:
> -    virtual void EmitCodeRegion();
> -
> -    /// ForceCodeRegion - Forcibly sets the current region mode to code.  Used
> -    /// at function entry points.
> -    void ForceCodeRegion() { RegionIndicator = Code; }
> -
> -
>     virtual void EmitEHSymAttributes(const MCSymbol *Symbol,
>                                      MCSymbol *EHSymbol);
>
> -    /// EmitAssemblerFlag - Note in the output the specified @p Flag
> +    /// EmitAssemblerFlag - Note in the output the specified @p Flag.
>     virtual void EmitAssemblerFlag(MCAssemblerFlag Flag) = 0;
>
> +    /// EmitDataRegion - Note in the output the specified region @p Kind.
> +    virtual void EmitDataRegion(MCDataRegionType Kind) {}
> +
>     /// EmitThumbFunc - Note in the output that the specified @p Func is
>     /// a Thumb mode function (ARM target only).
>     virtual void EmitThumbFunc(MCSymbol *Func) = 0;
>
> Modified: llvm/trunk/include/llvm/Object/MachOFormat.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/MachOFormat.h?rev=157062&r1=157061&r2=157062&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Object/MachOFormat.h (original)
> +++ llvm/trunk/include/llvm/Object/MachOFormat.h Fri May 18 14:12:01 2012
> @@ -97,7 +97,8 @@
>     DysymtabLoadCommandSize = 80,
>     Nlist32Size = 12,
>     Nlist64Size = 16,
> -    RelocationInfoSize = 8
> +    RelocationInfoSize = 8,
> +    LinkeditLoadCommandSize = 16
>   };
>
>   /// \brief Constants for header magic field.
> @@ -140,7 +141,8 @@
>     LCT_UUID = 0x1b,
>     LCT_CodeSignature = 0x1d,
>     LCT_SegmentSplitInfo = 0x1e,
> -    LCT_FunctionStarts = 0x26
> +    LCT_FunctionStarts = 0x26,
> +    LCT_DataInCode = 0x29
>   };
>
>   /// \brief Load command structure.
> @@ -280,6 +282,18 @@
>   };
>
>   /// @}
> +  /// @name Data-in-code Table Entry
> +  /// @{
> +
> +  // See <mach-o/loader.h>.
> +  enum DataRegionType { Data = 1, JumpTable8, JumpTable16, JumpTable32 };
> +  struct DataInCodeTableEntry {
> +    uint32_t Offset;  /* from mach_header to start of data region */
> +    uint16_t Length;  /* number of bytes in data region */
> +    uint16_t Kind;    /* a DataRegionType value  */
> +  };
> +
> +  /// @}
>   /// @name Indirect Symbol Table
>   /// @{
>
>
> Modified: llvm/trunk/include/llvm/Object/MachOObject.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/MachOObject.h?rev=157062&r1=157061&r2=157062&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Object/MachOObject.h (original)
> +++ llvm/trunk/include/llvm/Object/MachOObject.h Fri May 18 14:12:01 2012
> @@ -174,6 +174,9 @@
>   void ReadSymbol64TableEntry(
>     uint64_t SymbolTableOffset, unsigned Index,
>     InMemoryStruct<macho::Symbol64TableEntry> &Res) const;
> +  void ReadDataInCodeTableEntry(
> +    uint64_t TableOffset, unsigned Index,
> +    InMemoryStruct<macho::DataInCodeTableEntry> &Res) const;
>   void ReadULEB128s(uint64_t Index, SmallVectorImpl<uint64_t> &Out) const;
>
>   /// @}
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=157062&r1=157061&r2=157062&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Fri May 18 14:12:01 2012
> @@ -475,10 +475,8 @@
>  void AsmPrinter::EmitFunctionEntryLabel() {
>   // The function label could have already been emitted if two symbols end up
>   // conflicting due to asm renaming.  Detect this and emit an error.
> -  if (CurrentFnSym->isUndefined()) {
> -    OutStreamer.ForceCodeRegion();
> +  if (CurrentFnSym->isUndefined())
>     return OutStreamer.EmitLabel(CurrentFnSym);
> -  }
>
>   report_fatal_error("'" + Twine(CurrentFnSym->getName()) +
>                      "' label emitted multiple times to assembly file");
> @@ -1085,15 +1083,6 @@
>
>   EmitAlignment(Log2_32(MJTI->getEntryAlignment(*TM.getTargetData())));
>
> -  // If we know the form of the jump table, go ahead and tag it as such.
> -  if (!JTInDiffSection) {
> -    if (MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32) {
> -      OutStreamer.EmitJumpTable32Region();
> -    } else {
> -      OutStreamer.EmitDataRegion();
> -    }
> -  }
> -
>   for (unsigned JTI = 0, e = JT.size(); JTI != e; ++JTI) {
>     const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs;
>
>
> Modified: llvm/trunk/lib/MC/MCAsmInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmInfo.cpp?rev=157062&r1=157061&r2=157062&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCAsmInfo.cpp (original)
> +++ llvm/trunk/lib/MC/MCAsmInfo.cpp Fri May 18 14:12:01 2012
> @@ -50,6 +50,7 @@
>   AllowNameToStartWithDigit = false;
>   AllowPeriodsInName = true;
>   AllowUTF8 = true;
> +  UseDataRegionDirectives = false;
>   ZeroDirective = "\t.zero\t";
>   AsciiDirective = "\t.ascii\t";
>   AscizDirective = "\t.asciz\t";
> @@ -57,12 +58,6 @@
>   Data16bitsDirective = "\t.short\t";
>   Data32bitsDirective = "\t.long\t";
>   Data64bitsDirective = "\t.quad\t";
> -  DataBegin = "$d.";
> -  CodeBegin = "$a.";
> -  JT8Begin = "$d.";
> -  JT16Begin = "$d.";
> -  JT32Begin = "$d.";
> -  SupportsDataRegions = false;
>   SunStyleELFSectionSwitchSyntax = false;
>   UsesELFSectionDirectiveForBSS = false;
>   AlignDirective = "\t.align\t";
>
> Modified: llvm/trunk/lib/MC/MCAsmInfoCOFF.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmInfoCOFF.cpp?rev=157062&r1=157061&r2=157062&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCAsmInfoCOFF.cpp (original)
> +++ llvm/trunk/lib/MC/MCAsmInfoCOFF.cpp Fri May 18 14:12:01 2012
> @@ -36,8 +36,6 @@
>   SupportsDebugInformation = true;
>   DwarfSectionOffsetDirective = "\t.secrel32\t";
>   HasMicrosoftFastStdCallMangling = true;
> -
> -  SupportsDataRegions = false;
>  }
>
>  void MCAsmInfoMicrosoft::anchor() { }
>
> Modified: llvm/trunk/lib/MC/MCAsmInfoDarwin.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmInfoDarwin.cpp?rev=157062&r1=157061&r2=157062&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCAsmInfoDarwin.cpp (original)
> +++ llvm/trunk/lib/MC/MCAsmInfoDarwin.cpp Fri May 18 14:12:01 2012
> @@ -43,13 +43,6 @@
>   HasMachoTBSSDirective = true; // Uses .tbss
>   HasStaticCtorDtorReferenceInStaticMode = true;
>
> -  CodeBegin = "L$start$code$";
> -  DataBegin = "L$start$data$";
> -  JT8Begin  = "L$start$jt8$";
> -  JT16Begin = "L$start$jt16$";
> -  JT32Begin = "L$start$jt32$";
> -  SupportsDataRegions = true;
> -
>   // FIXME: Darwin 10 and newer don't need this.
>   LinkerRequiresNonEmptyDwarfLines = true;
>
>
> Modified: llvm/trunk/lib/MC/MCAsmStreamer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmStreamer.cpp?rev=157062&r1=157061&r2=157062&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCAsmStreamer.cpp (original)
> +++ llvm/trunk/lib/MC/MCAsmStreamer.cpp Fri May 18 14:12:01 2012
> @@ -138,6 +138,7 @@
>   virtual void EmitEHSymAttributes(const MCSymbol *Symbol,
>                                    MCSymbol *EHSymbol);
>   virtual void EmitAssemblerFlag(MCAssemblerFlag Flag);
> +  virtual void EmitDataRegion(MCDataRegionType Kind);
>   virtual void EmitThumbFunc(MCSymbol *Func);
>
>   virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value);
> @@ -352,6 +353,21 @@
>   EmitEOL();
>  }
>
> +void MCAsmStreamer::EmitDataRegion(MCDataRegionType Kind) {
> +  MCContext &Ctx = getContext();
> +  const MCAsmInfo &MAI = Ctx.getAsmInfo();
> +  if (!MAI.doesSupportDataRegionDirectives())
> +    return;
> +  switch (Kind) {
> +  case MCDR_DataRegion:            OS << "\t.data_region"; break;
> +  case MCDR_DataRegionJT8:         OS << "\t.data_region jt8"; break;
> +  case MCDR_DataRegionJT16:        OS << "\t.data_region jt16"; break;
> +  case MCDR_DataRegionJT32:        OS << "\t.data_region jt32"; break;
> +  case MCDR_DataRegionEnd:         OS << "\t.end_data_region"; break;
> +  }
> +  EmitEOL();
> +}
> +
>  void MCAsmStreamer::EmitThumbFunc(MCSymbol *Func) {
>   // This needs to emit to a temporary string to get properly quoted
>   // MCSymbols when they have spaces in them.
>
> Modified: llvm/trunk/lib/MC/MCELFStreamer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCELFStreamer.cpp?rev=157062&r1=157061&r2=157062&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCELFStreamer.cpp (original)
> +++ llvm/trunk/lib/MC/MCELFStreamer.cpp Fri May 18 14:12:01 2012
> @@ -13,6 +13,8 @@
>
>  #include "MCELF.h"
>  #include "llvm/ADT/SmallPtrSet.h"
> +#include "llvm/ADT/StringExtras.h"
> +#include "llvm/ADT/Twine.h"
>  #include "llvm/MC/MCAssembler.h"
>  #include "llvm/MC/MCCodeEmitter.h"
>  #include "llvm/MC/MCContext.h"
>
> Modified: llvm/trunk/lib/MC/MCMachOStreamer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCMachOStreamer.cpp?rev=157062&r1=157061&r2=157062&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCMachOStreamer.cpp (original)
> +++ llvm/trunk/lib/MC/MCMachOStreamer.cpp Fri May 18 14:12:01 2012
> @@ -1,4 +1,3 @@
> -//===- lib/MC/MCMachOStreamer.cpp - Mach-O Object Output ------------===//
>  //
>  //                     The LLVM Compiler Infrastructure
>  //
> @@ -33,6 +32,8 @@
>  private:
>   virtual void EmitInstToData(const MCInst &Inst);
>
> +  void EmitDataRegion(DataRegionData::KindTy Kind);
> +  void EmitDataRegionEnd();
>  public:
>   MCMachOStreamer(MCContext &Context, MCAsmBackend &MAB,
>                   raw_ostream &OS, MCCodeEmitter *Emitter)
> @@ -46,6 +47,7 @@
>   virtual void EmitEHSymAttributes(const MCSymbol *Symbol,
>                                    MCSymbol *EHSymbol);
>   virtual void EmitAssemblerFlag(MCAssemblerFlag Flag);
> +  virtual void EmitDataRegion(MCDataRegionType Kind);
>   virtual void EmitThumbFunc(MCSymbol *Func);
>   virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value);
>   virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute);
> @@ -138,6 +140,26 @@
>   SD.setFlags(SD.getFlags() & ~SF_ReferenceTypeMask);
>  }
>
> +void MCMachOStreamer::EmitDataRegion(DataRegionData::KindTy Kind) {
> +  // Create a temporary label to mark the start of the data region.
> +  MCSymbol *Start = getContext().CreateTempSymbol();
> +  EmitLabel(Start);
> +  // Record the region for the object writer to use.
> +  DataRegionData Data = { Kind, Start, NULL };
> +  std::vector<DataRegionData> &Regions = getAssembler().getDataRegions();
> +  Regions.push_back(Data);
> +}
> +
> +void MCMachOStreamer::EmitDataRegionEnd() {
> +  std::vector<DataRegionData> &Regions = getAssembler().getDataRegions();
> +  assert(Regions.size() && "Mismatched .end_data_region!");
> +  DataRegionData &Data = Regions.back();
> +  assert(Data.End == NULL && "Mismatched .end_data_region!");
> +  // Create a temporary label to mark the end of the data region.
> +  Data.End = getContext().CreateTempSymbol();
> +  EmitLabel(Data.End);
> +}
> +
>  void MCMachOStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {
>   // Let the target do whatever target specific stuff it needs to do.
>   getAssembler().getBackend().handleAssemblerFlag(Flag);
> @@ -153,6 +175,26 @@
>   }
>  }
>
> +void MCMachOStreamer::EmitDataRegion(MCDataRegionType Kind) {
> +  switch (Kind) {
> +  case MCDR_DataRegion:
> +    EmitDataRegion(DataRegionData::Data);
> +    return;
> +  case MCDR_DataRegionJT8:
> +    EmitDataRegion(DataRegionData::JumpTable8);
> +    return;
> +  case MCDR_DataRegionJT16:
> +    EmitDataRegion(DataRegionData::JumpTable16);
> +    return;
> +  case MCDR_DataRegionJT32:
> +    EmitDataRegion(DataRegionData::JumpTable32);
> +    return;
> +  case MCDR_DataRegionEnd:
> +    EmitDataRegionEnd();
> +    return;
> +  }
> +}
> +
>  void MCMachOStreamer::EmitThumbFunc(MCSymbol *Symbol) {
>   // Remember that the function is a thumb function. Fixup and relocation
>   // values will need adjusted.
>
> Modified: llvm/trunk/lib/MC/MCParser/DarwinAsmParser.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/DarwinAsmParser.cpp?rev=157062&r1=157061&r2=157062&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCParser/DarwinAsmParser.cpp (original)
> +++ llvm/trunk/lib/MC/MCParser/DarwinAsmParser.cpp Fri May 18 14:12:01 2012
> @@ -14,6 +14,7 @@
>  #include "llvm/MC/MCSymbol.h"
>  #include "llvm/MC/MCParser/MCAsmLexer.h"
>  #include "llvm/MC/MCParser/MCAsmParser.h"
> +#include "llvm/ADT/StringSwitch.h"
>  #include "llvm/ADT/StringRef.h"
>  #include "llvm/ADT/Twine.h"
>  #include "llvm/Support/MemoryBuffer.h"
> @@ -56,6 +57,9 @@
>     AddDirectiveHandler<&DarwinAsmParser::ParseDirectiveTBSS>(".tbss");
>     AddDirectiveHandler<&DarwinAsmParser::ParseDirectiveZerofill>(".zerofill");
>
> +    AddDirectiveHandler<&DarwinAsmParser::ParseDirectiveDataRegion>(".data_region");
> +    AddDirectiveHandler<&DarwinAsmParser::ParseDirectiveDataRegionEnd>(".end_data_region");
> +
>     // Special section directives.
>     AddDirectiveHandler<&DarwinAsmParser::ParseSectionDirectiveConst>(".const");
>     AddDirectiveHandler<&DarwinAsmParser::ParseSectionDirectiveConstData>(".const_data");
> @@ -113,6 +117,8 @@
>   bool ParseDirectiveSubsectionsViaSymbols(StringRef, SMLoc);
>   bool ParseDirectiveTBSS(StringRef, SMLoc);
>   bool ParseDirectiveZerofill(StringRef, SMLoc);
> +  bool ParseDirectiveDataRegion(StringRef, SMLoc);
> +  bool ParseDirectiveDataRegionEnd(StringRef, SMLoc);
>
>   // Named Section Directive
>   bool ParseSectionDirectiveConst(StringRef, SMLoc) {
> @@ -659,6 +665,42 @@
>   return false;
>  }
>
> +/// ParseDirectiveDataRegion
> +///  ::= .data_region [ ( jt8 | jt16 | jt32 ) ]
> +bool DarwinAsmParser::ParseDirectiveDataRegion(StringRef, SMLoc) {
> +  if (getLexer().is(AsmToken::EndOfStatement)) {
> +    Lex();
> +    getStreamer().EmitDataRegion(MCDR_DataRegion);
> +    return false;
> +  }
> +  StringRef RegionType;
> +  SMLoc Loc = getParser().getTok().getLoc();
> +  if (getParser().ParseIdentifier(RegionType))
> +    return TokError("expected region type after '.data_region' directive");
> +  int Kind = StringSwitch<int>(RegionType)
> +    .Case("jt8", MCDR_DataRegionJT8)
> +    .Case("jt16", MCDR_DataRegionJT16)
> +    .Case("jt32", MCDR_DataRegionJT32)
> +    .Default(-1);
> +  if (Kind == -1)
> +    return Error(Loc, "unknown region type in '.data_region' directive");
> +  Lex();
> +
> +  getStreamer().EmitDataRegion((MCDataRegionType)Kind);
> +  return false;
> +}
> +
> +/// ParseDirectiveDataRegionEnd
> +///  ::= .end_data_region
> +bool DarwinAsmParser::ParseDirectiveDataRegionEnd(StringRef, SMLoc) {
> +  if (getLexer().isNot(AsmToken::EndOfStatement))
> +    return TokError("unexpected token in '.end_data_region' directive");
> +
> +  Lex();
> +  getStreamer().EmitDataRegion(MCDR_DataRegionEnd);
> +  return false;
> +}
> +
>  namespace llvm {
>
>  MCAsmParserExtension *createDarwinAsmParser() {
>
> Modified: llvm/trunk/lib/MC/MCStreamer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCStreamer.cpp?rev=157062&r1=157061&r2=157062&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCStreamer.cpp (original)
> +++ llvm/trunk/lib/MC/MCStreamer.cpp Fri May 18 14:12:01 2012
> @@ -20,12 +20,9 @@
>  #include <cstdlib>
>  using namespace llvm;
>
> -MCStreamer::MCStreamer(MCContext &Ctx) : Context(Ctx), EmitEHFrame(true),
> -                                         EmitDebugFrame(false),
> -                                         CurrentW64UnwindInfo(0),
> -                                         LastSymbol(0),
> -                                         UniqueCodeBeginSuffix(0),
> -                                         UniqueDataBeginSuffix(0) {
> +MCStreamer::MCStreamer(MCContext &Ctx)
> +  : Context(Ctx), EmitEHFrame(true), EmitDebugFrame(false),
> +    CurrentW64UnwindInfo(0), LastSymbol(0) {
>   const MCSection *section = NULL;
>   SectionStack.push_back(std::make_pair(section, section));
>  }
> @@ -183,85 +180,6 @@
>   LastSymbol = Symbol;
>  }
>
> -void MCStreamer::EmitDataRegion() {
> -  if (RegionIndicator == Data) return;
> -
> -  MCContext &Context = getContext();
> -  const MCAsmInfo &MAI = Context.getAsmInfo();
> -  if (!MAI.getSupportsDataRegions()) return;
> -
> -  // Generate a unique symbol name.
> -  MCSymbol *NewSym = Context.GetOrCreateSymbol(MAI.getDataBeginLabelName() +
> -                                               Twine(UniqueDataBeginSuffix++));
> -  EmitLabel(NewSym);
> -
> -  RegionIndicator = Data;
> -}
> -
> -void MCStreamer::EmitCodeRegion() {
> -  if (RegionIndicator == Code) return;
> -
> -  MCContext &Context = getContext();
> -  const MCAsmInfo &MAI = Context.getAsmInfo();
> -  if (!MAI.getSupportsDataRegions()) return;
> -
> -  // Generate a unique symbol name.
> -  MCSymbol *NewSym = Context.GetOrCreateSymbol(MAI.getCodeBeginLabelName() +
> -                                               Twine(UniqueCodeBeginSuffix++));
> -  EmitLabel(NewSym);
> -
> -  RegionIndicator = Code;
> -}
> -
> -void MCStreamer::EmitJumpTable8Region() {
> -  if (RegionIndicator == JumpTable8) return;
> -
> -  MCContext &Context = getContext();
> -  const MCAsmInfo &MAI = Context.getAsmInfo();
> -  if (!MAI.getSupportsDataRegions()) return;
> -
> -  // Generate a unique symbol name.
> -  MCSymbol *NewSym =
> -    Context.GetOrCreateSymbol(MAI.getJumpTable8BeginLabelName() +
> -                              Twine(UniqueDataBeginSuffix++));
> -  EmitLabel(NewSym);
> -
> -  RegionIndicator = JumpTable8;
> -}
> -
> -void MCStreamer::EmitJumpTable16Region() {
> -  if (RegionIndicator == JumpTable16) return;
> -
> -  MCContext &Context = getContext();
> -  const MCAsmInfo &MAI = Context.getAsmInfo();
> -  if (!MAI.getSupportsDataRegions()) return;
> -
> -  // Generate a unique symbol name.
> -  MCSymbol *NewSym =
> -    Context.GetOrCreateSymbol(MAI.getJumpTable16BeginLabelName() +
> -                              Twine(UniqueDataBeginSuffix++));
> -  EmitLabel(NewSym);
> -
> -  RegionIndicator = JumpTable16;
> -}
> -
> -
> -void MCStreamer::EmitJumpTable32Region() {
> -  if (RegionIndicator == JumpTable32) return;
> -
> -  MCContext &Context = getContext();
> -  const MCAsmInfo &MAI = Context.getAsmInfo();
> -  if (!MAI.getSupportsDataRegions()) return;
> -
> -  // Generate a unique symbol name.
> -  MCSymbol *NewSym =
> -    Context.GetOrCreateSymbol(MAI.getJumpTable32BeginLabelName() +
> -                              Twine(UniqueDataBeginSuffix++));
> -  EmitLabel(NewSym);
> -
> -  RegionIndicator = JumpTable32;
> -}
> -
>  void MCStreamer::EmitCompactUnwindEncoding(uint32_t CompactUnwindEncoding) {
>   EnsureValidFrame();
>   MCDwarfFrameInfo *CurFrame = getCurrentFrameInfo();
> @@ -283,7 +201,6 @@
>   EmitCFIStartProcImpl(Frame);
>
>   FrameInfos.push_back(Frame);
> -  RegionIndicator = Code;
>  }
>
>  void MCStreamer::EmitCFIStartProcImpl(MCDwarfFrameInfo &Frame) {
>
> Modified: llvm/trunk/lib/MC/MachObjectWriter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MachObjectWriter.cpp?rev=157062&r1=157061&r2=157062&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MachObjectWriter.cpp (original)
> +++ llvm/trunk/lib/MC/MachObjectWriter.cpp Fri May 18 14:12:01 2012
> @@ -21,6 +21,7 @@
>  #include "llvm/MC/MCMachOSymbolFlags.h"
>  #include "llvm/MC/MCValue.h"
>  #include "llvm/Object/MachOFormat.h"
> +#include "llvm/Support/Debug.h"
>  #include "llvm/Support/ErrorHandling.h"
>
>  #include <vector>
> @@ -351,6 +352,21 @@
>     Write32(Address);
>  }
>
> +void MachObjectWriter::WriteLinkeditLoadCommand(uint32_t Type,
> +                                                uint32_t DataOffset,
> +                                                uint32_t DataSize) {
> +  uint64_t Start = OS.tell();
> +  (void) Start;
> +
> +  Write32(Type);
> +  Write32(macho::LinkeditLoadCommandSize);
> +  Write32(DataOffset);
> +  Write32(DataSize);
> +
> +  assert(OS.tell() - Start == macho::LinkeditLoadCommandSize);
> +}
> +
> +
>  void MachObjectWriter::RecordRelocation(const MCAssembler &Asm,
>                                         const MCAsmLayout &Layout,
>                                         const MCFragment *Fragment,
> @@ -654,6 +670,13 @@
>                          macho::DysymtabLoadCommandSize);
>   }
>
> +  // Add the data-in-code load command size, if used.
> +  unsigned NumDataRegions = Asm.getDataRegions().size();
> +  if (NumDataRegions) {
> +    ++NumLoadCommands;
> +    LoadCommandsSize += macho::LinkeditLoadCommandSize;
> +  }
> +
>   // Compute the total size of the section data, as well as its file size and vm
>   // size.
>   uint64_t SectionDataStart = (is64Bit() ? macho::Header64Size :
> @@ -701,6 +724,15 @@
>     RelocTableEnd += NumRelocs * macho::RelocationInfoSize;
>   }
>
> +  // Write the data-in-code load command, if used.
> +  uint64_t DataInCodeTableEnd = RelocTableEnd + NumDataRegions * 8;
> +  if (NumDataRegions) {
> +    uint64_t DataRegionsOffset = RelocTableEnd;
> +    uint64_t DataRegionsSize = NumDataRegions * 8;
> +    WriteLinkeditLoadCommand(macho::LCT_DataInCode, DataRegionsOffset,
> +                             DataRegionsSize);
> +  }
> +
>   // Write the symbol table load command, if used.
>   if (NumSymbols) {
>     unsigned FirstLocalSymbol = 0;
> @@ -717,10 +749,10 @@
>
>     // If used, the indirect symbols are written after the section data.
>     if (NumIndirectSymbols)
> -      IndirectSymbolOffset = RelocTableEnd;
> +      IndirectSymbolOffset = DataInCodeTableEnd;
>
>     // The symbol table is written after the indirect symbol data.
> -    uint64_t SymbolTableOffset = RelocTableEnd + IndirectSymbolSize;
> +    uint64_t SymbolTableOffset = DataInCodeTableEnd + IndirectSymbolSize;
>
>     // The string table is written after symbol table.
>     uint64_t StringTableOffset =
> @@ -760,6 +792,23 @@
>     }
>   }
>
> +  // Write out the data-in-code region payload, if there is one.
> +  for (MCAssembler::const_data_region_iterator
> +         it = Asm.data_region_begin(), ie = Asm.data_region_end();
> +         it != ie; ++it) {
> +    const DataRegionData *Data = &(*it);
> +    uint64_t Start = getSymbolAddress(&Layout.getAssembler().getSymbolData(*Data->Start), Layout);
> +    uint64_t End = getSymbolAddress(&Layout.getAssembler().getSymbolData(*Data->End), Layout);
> +    DEBUG(dbgs() << "data in code region-- kind: " << Data->Kind
> +                 << "  start: " << Start << "(" << Data->Start->getName() << ")"
> +                 << "  end: " << End << "(" << Data->End->getName() << ")"
> +                 << "  size: " << End - Start
> +                 << "\n");
> +    Write32(Start);
> +    Write16(End - Start);
> +    Write16(Data->Kind);
> +  }
> +
>   // Write the symbol table data, if used.
>   if (NumSymbols) {
>     // Write the indirect symbol entries.
>
> Modified: llvm/trunk/lib/Object/MachOObject.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/MachOObject.cpp?rev=157062&r1=157061&r2=157062&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Object/MachOObject.cpp (original)
> +++ llvm/trunk/lib/Object/MachOObject.cpp Fri May 18 14:12:01 2012
> @@ -357,6 +357,19 @@
>   ReadInMemoryStruct(*this, Buffer->getBuffer(), Offset, Res);
>  }
>
> +template<>
> +void SwapStruct(macho::DataInCodeTableEntry &Value) {
> +  SwapValue(Value.Offset);
> +  SwapValue(Value.Length);
> +  SwapValue(Value.Kind);
> +}
> +void MachOObject::ReadDataInCodeTableEntry(uint64_t TableOffset,
> +                                           unsigned Index,
> +                       InMemoryStruct<macho::DataInCodeTableEntry> &Res) const {
> +  uint64_t Offset = (TableOffset +
> +                     Index * sizeof(macho::DataInCodeTableEntry));
> +  ReadInMemoryStruct(*this, Buffer->getBuffer(), Offset, Res);
> +}
>
>  void MachOObject::ReadULEB128s(uint64_t Index,
>                                SmallVectorImpl<uint64_t> &Out) const {
>
> Modified: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp?rev=157062&r1=157061&r2=157062&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp Fri May 18 14:12:01 2012
> @@ -283,9 +283,16 @@
>   }
>  }
>
> -void ARMAsmPrinter::EmitFunctionEntryLabel() {
> -  OutStreamer.ForceCodeRegion();
> +void ARMAsmPrinter::EmitFunctionBodyEnd() {
> +  // Make sure to terminate any constant pools that were at the end
> +  // of the function.
> +  if (!InConstantPool)
> +    return;
> +  InConstantPool = false;
> +  OutStreamer.EmitDataRegion(MCDR_DataRegionEnd);
> +}
>
> +void ARMAsmPrinter::EmitFunctionEntryLabel() {
>   if (AFI->isThumbFunction()) {
>     OutStreamer.EmitAssemblerFlag(MCAF_Code16);
>     OutStreamer.EmitThumbFunc(CurrentFnSym);
> @@ -934,13 +941,13 @@
>   const MachineOperand &MO2 = MI->getOperand(OpNum+1); // Unique Id
>   unsigned JTI = MO1.getIndex();
>
> -  // Tag the jump table appropriately for precise disassembly.
> -  OutStreamer.EmitJumpTable32Region();
> -
>   // Emit a label for the jump table.
>   MCSymbol *JTISymbol = GetARMJTIPICJumpTableLabel2(JTI, MO2.getImm());
>   OutStreamer.EmitLabel(JTISymbol);
>
> +  // Mark the jump table as data-in-code.
> +  OutStreamer.EmitDataRegion(MCDR_DataRegionJT32);
> +
>   // Emit each entry of the table.
>   const MachineJumpTableInfo *MJTI = MF->getJumpTableInfo();
>   const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables();
> @@ -969,6 +976,8 @@
>                                      OutContext);
>     OutStreamer.EmitValue(Expr, 4);
>   }
> +  // Mark the end of jump table data-in-code region.
> +  OutStreamer.EmitDataRegion(MCDR_DataRegionEnd);
>  }
>
>  void ARMAsmPrinter::EmitJump2Table(const MachineInstr *MI) {
> @@ -978,15 +987,6 @@
>   const MachineOperand &MO2 = MI->getOperand(OpNum+1); // Unique Id
>   unsigned JTI = MO1.getIndex();
>
> -  // Emit a label for the jump table.
> -  if (MI->getOpcode() == ARM::t2TBB_JT) {
> -    OutStreamer.EmitJumpTable8Region();
> -  } else if (MI->getOpcode() == ARM::t2TBH_JT) {
> -    OutStreamer.EmitJumpTable16Region();
> -  } else {
> -    OutStreamer.EmitJumpTable32Region();
> -  }
> -
>   MCSymbol *JTISymbol = GetARMJTIPICJumpTableLabel2(JTI, MO2.getImm());
>   OutStreamer.EmitLabel(JTISymbol);
>
> @@ -995,10 +995,15 @@
>   const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables();
>   const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs;
>   unsigned OffsetWidth = 4;
> -  if (MI->getOpcode() == ARM::t2TBB_JT)
> +  if (MI->getOpcode() == ARM::t2TBB_JT) {
>     OffsetWidth = 1;
> -  else if (MI->getOpcode() == ARM::t2TBH_JT)
> +    // Mark the jump table as data-in-code.
> +    OutStreamer.EmitDataRegion(MCDR_DataRegionJT8);
> +  } else if (MI->getOpcode() == ARM::t2TBH_JT) {
>     OffsetWidth = 2;
> +    // Mark the jump table as data-in-code.
> +    OutStreamer.EmitDataRegion(MCDR_DataRegionJT16);
> +  }
>
>   for (unsigned i = 0, e = JTBBs.size(); i != e; ++i) {
>     MachineBasicBlock *MBB = JTBBs[i];
> @@ -1031,6 +1036,8 @@
>                                    OutContext);
>     OutStreamer.EmitValue(Expr, OffsetWidth);
>   }
> +  // Mark the end of jump table data-in-code region.
> +  OutStreamer.EmitDataRegion(MCDR_DataRegionEnd);
>  }
>
>  void ARMAsmPrinter::PrintDebugValueComment(const MachineInstr *MI,
> @@ -1208,8 +1215,11 @@
>  #include "ARMGenMCPseudoLowering.inc"
>
>  void ARMAsmPrinter::EmitInstruction(const MachineInstr *MI) {
> -  if (MI->getOpcode() != ARM::CONSTPOOL_ENTRY)
> -    OutStreamer.EmitCodeRegion();
> +  // If we just ended a constant pool, mark it as such.
> +  if (InConstantPool && MI->getOpcode() != ARM::CONSTPOOL_ENTRY) {
> +    OutStreamer.EmitDataRegion(MCDR_DataRegionEnd);
> +    InConstantPool = false;
> +  }
>
>   // Emit unwinding stuff for frame-related instructions
>   if (EnableARMEHABI && MI->getFlag(MachineInstr::FrameSetup))
> @@ -1565,9 +1575,12 @@
>     unsigned LabelId = (unsigned)MI->getOperand(0).getImm();
>     unsigned CPIdx   = (unsigned)MI->getOperand(1).getIndex();
>
> -    // Mark the constant pool entry as data if we're not already in a data
> -    // region.
> -    OutStreamer.EmitDataRegion();
> +    // If this is the first entry of the pool, mark it.
> +    if (!InConstantPool) {
> +      OutStreamer.EmitDataRegion(MCDR_DataRegion);
> +      InConstantPool = true;
> +    }
> +
>     OutStreamer.EmitLabel(GetCPISymbol(LabelId));
>
>     const MachineConstantPoolEntry &MCPE = MCP->getConstants()[CPIdx];
>
> Modified: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMAsmPrinter.h?rev=157062&r1=157061&r2=157062&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/ARMAsmPrinter.h (original)
> +++ llvm/trunk/lib/Target/ARM/ARMAsmPrinter.h Fri May 18 14:12:01 2012
> @@ -44,9 +44,12 @@
>   /// MachineFunction.
>   const MachineConstantPool *MCP;
>
> +  /// InConstantPool - Maintain state when emitting a sequence of constant
> +  /// pool entries so we can properly mark them as data regions.
> +  bool InConstantPool;
>  public:
>   explicit ARMAsmPrinter(TargetMachine &TM, MCStreamer &Streamer)
> -    : AsmPrinter(TM, Streamer), AFI(NULL), MCP(NULL) {
> +    : AsmPrinter(TM, Streamer), AFI(NULL), MCP(NULL), InConstantPool(false) {
>       Subtarget = &TM.getSubtarget<ARMSubtarget>();
>     }
>
> @@ -70,6 +73,7 @@
>   bool runOnMachineFunction(MachineFunction &F);
>
>   virtual void EmitConstantPool() {} // we emit constant pools customly!
> +  virtual void EmitFunctionBodyEnd();
>   virtual void EmitFunctionEntryLabel();
>   void EmitStartOfAsmFile(Module &M);
>   void EmitEndOfAsmFile(Module &M);
>
> Modified: llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMCAsmInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMCAsmInfo.cpp?rev=157062&r1=157061&r2=157062&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMCAsmInfo.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMCAsmInfo.cpp Fri May 18 14:12:01 2012
> @@ -29,6 +29,7 @@
>   CommentString = "@";
>   Code16Directive = ".code\t16";
>   Code32Directive = ".code\t32";
> +  UseDataRegionDirectives = true;
>
>   SupportsDebugInformation = true;
>
>
> Modified: llvm/trunk/lib/Target/X86/X86MCInstLower.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86MCInstLower.cpp?rev=157062&r1=157061&r2=157062&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86MCInstLower.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86MCInstLower.cpp Fri May 18 14:12:01 2012
> @@ -610,8 +610,6 @@
>  }
>
>  void X86AsmPrinter::EmitInstruction(const MachineInstr *MI) {
> -  OutStreamer.EmitCodeRegion();
> -
>   X86MCInstLower MCInstLowering(Mang, *MF, *this);
>   switch (MI->getOpcode()) {
>   case TargetOpcode::DBG_VALUE:
>
> Added: llvm/trunk/test/CodeGen/ARM/data-in-code-annotations.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/data-in-code-annotations.ll?rev=157062&view=auto
> ==============================================================================
> --- llvm/trunk/test/CodeGen/ARM/data-in-code-annotations.ll (added)
> +++ llvm/trunk/test/CodeGen/ARM/data-in-code-annotations.ll Fri May 18 14:12:01 2012
> @@ -0,0 +1,42 @@
> +; RUN: llc < %s -mtriple=armv7-apple-darwin | FileCheck %s
> +
> +define double @f1() nounwind {
> +; CHECK: f1:
> +; CHECK: .data_region
> +; CHECK: .long 1413754129
> +; CHECK: .long 1074340347
> +; CHECK: .end_data_region
> +  ret double 0x400921FB54442D11
> +}
> +
> +
> +define i32 @f2()  {
> +; CHECK: f2:
> +; CHECK: .data_region jt32
> +; CHECK: .end_data_region
> +
> +entry:
> +  switch i32 undef, label %return [
> +    i32 1, label %sw.bb
> +    i32 2, label %sw.bb6
> +    i32 3, label %sw.bb13
> +    i32 4, label %sw.bb20
> +  ]
> +
> +sw.bb:                                            ; preds = %entry
> +  br label %return
> +
> +sw.bb6:                                           ; preds = %entry
> +  br label %return
> +
> +sw.bb13:                                          ; preds = %entry
> +  br label %return
> +
> +sw.bb20:                                          ; preds = %entry
> +  %div = sdiv i32 undef, undef
> +  br label %return
> +
> +return:                                           ; preds = %sw.bb20, %sw.bb13, %sw.bb6, %sw.bb, %entry
> +  %retval.0 = phi i32 [ %div, %sw.bb20 ], [ undef, %sw.bb13 ], [ undef, %sw.bb6 ], [ undef, %sw.bb ], [ 0, %entry ]
> +  ret i32 %retval.0
> +}
>
> Modified: llvm/trunk/test/CodeGen/Thumb2/thumb2-tbb.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Thumb2/thumb2-tbb.ll?rev=157062&r1=157061&r2=157062&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/Thumb2/thumb2-tbb.ll (original)
> +++ llvm/trunk/test/CodeGen/Thumb2/thumb2-tbb.ll Fri May 18 14:12:01 2012
> @@ -5,7 +5,9 @@
>  entry:
>  ; CHECK: bar:
>  ; CHECK: tbb
> -; CHECK: .align 1
> +; CHECK: .data_region jt8
> +; CHECK: .end_data_region
> +; CHECK-NEXT: .align 1
>
>     switch i32 %n.u, label %bb12 [i32 1, label %bb i32 2, label %bb6 i32 4, label %bb7 i32 5, label %bb8 i32 6, label %bb10 i32 7, label %bb1 i32 8, label %bb3 i32 9, label %bb4 i32 10, label %bb9 i32 11, label %bb2 i32 12, label %bb5 i32 13, label %bb11 ]
>  bb:
>
> Modified: llvm/trunk/test/MC/ARM/elf-reloc-01.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/elf-reloc-01.ll?rev=157062&r1=157061&r2=157062&view=diff
> ==============================================================================
> --- llvm/trunk/test/MC/ARM/elf-reloc-01.ll (original)
> +++ llvm/trunk/test/MC/ARM/elf-reloc-01.ll Fri May 18 14:12:01 2012
> @@ -61,7 +61,7 @@
>  declare void @exit(i32) noreturn nounwind
>
>  ;; OBJ:          Relocation 1
> -;; OBJ-NEXT:     'r_offset',
> +;; OBJ-NEXT:     'r_offset',
>  ;; OBJ-NEXT:     'r_sym', 0x000002
>  ;; OBJ-NEXT:     'r_type', 0x2b
>
>
> Added: llvm/trunk/test/MC/MachO/ARM/data-in-code.s
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/MachO/ARM/data-in-code.s?rev=157062&view=auto
> ==============================================================================
> --- llvm/trunk/test/MC/MachO/ARM/data-in-code.s (added)
> +++ llvm/trunk/test/MC/MachO/ARM/data-in-code.s Fri May 18 14:12:01 2012
> @@ -0,0 +1,33 @@
> +@ RUN: llvm-mc -triple armv7-apple-darwin10 -filetype=obj -o - < %s | macho-dump | FileCheck %s
> +        .text
> +_foo:
> +@ CHECK: # DICE 0
> +@ CHECK: ('offset', 0)
> +@ CHECK: ('length', 4)
> +@ CHECK: ('kind', 1)
> +@ CHECK: # DICE 1
> +@ CHECK: ('offset', 4)
> +@ CHECK: ('length', 4)
> +@ CHECK: ('kind', 4)
> +@ CHECK: # DICE 2
> +@ CHECK: ('offset', 8)
> +@ CHECK: ('length', 2)
> +@ CHECK: ('kind', 3)
> +@ CHECK: # DICE 3
> +@ CHECK: ('offset', 10)
> +@ CHECK: ('length', 1)
> +@ CHECK: ('kind', 2)
> +
> +.data_region
> +        .long 10
> +.end_data_region
> +.data_region jt32
> +        .long 1
> +.end_data_region
> +.data_region jt16
> +        .short 2
> +.end_data_region
> +.data_region jt8
> +        .byte 3
> +.end_data_region
> +
>
> Modified: llvm/trunk/tools/macho-dump/macho-dump.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/macho-dump/macho-dump.cpp?rev=157062&r1=157061&r2=157062&view=diff
> ==============================================================================
> --- llvm/trunk/tools/macho-dump/macho-dump.cpp (original)
> +++ llvm/trunk/tools/macho-dump/macho-dump.cpp Fri May 18 14:12:01 2012
> @@ -332,6 +332,35 @@
>   return 0;
>  }
>
> +static int DumpDataInCodeDataCommand(MachOObject &Obj,
> +                                     const MachOObject::LoadCommandInfo &LCI) {
> +  InMemoryStruct<macho::LinkeditDataLoadCommand> LLC;
> +  Obj.ReadLinkeditDataLoadCommand(LCI, LLC);
> +  if (!LLC)
> +    return Error("unable to read segment load command");
> +
> +  outs() << "  ('dataoff', " << LLC->DataOffset << ")\n"
> +         << "  ('datasize', " << LLC->DataSize << ")\n"
> +         << "  ('_data_regions', [\n";
> +
> +
> +  unsigned NumRegions = LLC->DataSize / 8;
> +  for (unsigned i = 0; i < NumRegions; ++i) {
> +    InMemoryStruct<macho::DataInCodeTableEntry> DICE;
> +    Obj.ReadDataInCodeTableEntry(LLC->DataOffset, i, DICE);
> +    if (!DICE)
> +      return Error("unable to read DataInCodeTableEntry");
> +    outs() << "    # DICE " << i << "\n"
> +           << "    ('offset', " << DICE->Offset << ")\n"
> +           << "    ('length', " << DICE->Length << ")\n"
> +           << "    ('kind', " << DICE->Kind << ")\n";
> +  }
> +
> +  outs() <<"  ])\n";
> +
> +  return 0;
> +}
> +
>
>  static int DumpLoadCommand(MachOObject &Obj, unsigned Index) {
>   const MachOObject::LoadCommandInfo &LCI = Obj.getLoadCommandInfo(Index);
> @@ -358,6 +387,9 @@
>   case macho::LCT_FunctionStarts:
>     Res = DumpLinkeditDataCommand(Obj, LCI);
>     break;
> +  case macho::LCT_DataInCode:
> +    Res = DumpDataInCodeDataCommand(Obj, LCI);
> +    break;
>   default:
>     Warning("unknown load command: " + Twine(LCI.Command.Type));
>     break;
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



-- 
Alexander Potapenko
Software Engineer
Google Moscow




More information about the llvm-commits mailing list