[llvm-commits] [llvm] r169609 - in /llvm/trunk: include/llvm/MC/ lib/MC/ lib/Target/ARM/MCTargetDesc/ test/CodeGen/ARM/ test/MC/ARM/

Renato Golin rengolin at systemcall.org
Fri Dec 7 09:04:40 PST 2012


Nice!

Thanks Greg and Tim!

On 7 December 2012 16:50, Tim Northover <Tim.Northover at arm.com> wrote:
> Author: tnorthover
> Date: Fri Dec  7 10:50:23 2012
> New Revision: 169609
>
> URL: http://llvm.org/viewvc/llvm-project?rev=169609&view=rev
> Log:
> Added Mapping Symbols for ARM ELF
>
> Before this patch, when you objdump an LLVM-compiled file, objdump tried to
> decode data-in-code sections as if they were code.  This patch adds the missing
> Mapping Symbols, as defined by "ELF for the ARM Architecture" (ARM IHI 0044D).
>
> Patch based on work by Greg Fitzgerald.
>
> Added:
>     llvm/trunk/include/llvm/MC/MCELF.h   (contents, props changed)
>       - copied, changed from r169604, llvm/trunk/lib/MC/MCELF.h
>     llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp   (with props)
>     llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.h   (with props)
>     llvm/trunk/test/MC/ARM/data-in-code.ll   (with props)
>     llvm/trunk/test/MC/ARM/mapping-within-section.s   (with props)
>     llvm/trunk/test/MC/ARM/multi-section-mapping.s   (with props)
>     llvm/trunk/test/MC/ARM/relocated-mapping.s   (with props)
> Removed:
>     llvm/trunk/lib/MC/MCELF.h
> Modified:
>     llvm/trunk/lib/MC/ELFObjectWriter.cpp
>     llvm/trunk/lib/MC/MCELF.cpp
>     llvm/trunk/lib/MC/MCELFStreamer.cpp
>     llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
>     llvm/trunk/lib/Target/ARM/MCTargetDesc/CMakeLists.txt
>     llvm/trunk/test/CodeGen/ARM/2010-11-30-reloc-movt.ll
>     llvm/trunk/test/MC/ARM/elf-reloc-01.ll
>     llvm/trunk/test/MC/ARM/elf-reloc-02.ll
>     llvm/trunk/test/MC/ARM/elf-reloc-03.ll
>     llvm/trunk/test/MC/ARM/elf-reloc-condcall.s
>     llvm/trunk/test/MC/ARM/elf-thumbfunc-reloc.ll
>     llvm/trunk/test/MC/ARM/elf-thumbfunc.s
>
> Copied: llvm/trunk/include/llvm/MC/MCELF.h (from r169604, llvm/trunk/lib/MC/MCELF.h)
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCELF.h?p2=llvm/trunk/include/llvm/MC/MCELF.h&p1=llvm/trunk/lib/MC/MCELF.h&r1=169604&r2=169609&rev=169609&view=diff
> ==============================================================================
>     (empty)
>
> Propchange: llvm/trunk/include/llvm/MC/MCELF.h
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
> Modified: llvm/trunk/lib/MC/ELFObjectWriter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/ELFObjectWriter.cpp?rev=169609&r1=169608&r2=169609&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/ELFObjectWriter.cpp (original)
> +++ llvm/trunk/lib/MC/ELFObjectWriter.cpp Fri Dec  7 10:50:23 2012
> @@ -12,7 +12,6 @@
>  //===----------------------------------------------------------------------===//
>
>  #include "llvm/MC/MCELFObjectWriter.h"
> -#include "MCELF.h"
>  #include "llvm/ADT/OwningPtr.h"
>  #include "llvm/ADT/STLExtras.h"
>  #include "llvm/ADT/SmallPtrSet.h"
> @@ -22,6 +21,7 @@
>  #include "llvm/MC/MCAsmLayout.h"
>  #include "llvm/MC/MCAssembler.h"
>  #include "llvm/MC/MCContext.h"
> +#include "llvm/MC/MCELF.h"
>  #include "llvm/MC/MCELFSymbolFlags.h"
>  #include "llvm/MC/MCExpr.h"
>  #include "llvm/MC/MCFixupKindInfo.h"
>
> Modified: llvm/trunk/lib/MC/MCELF.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCELF.cpp?rev=169609&r1=169608&r2=169609&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCELF.cpp (original)
> +++ llvm/trunk/lib/MC/MCELF.cpp Fri Dec  7 10:50:23 2012
> @@ -11,7 +11,7 @@
>  //
>  //===----------------------------------------------------------------------===//
>
> -#include "MCELF.h"
> +#include "llvm/MC/MCELF.h"
>  #include "llvm/MC/MCAssembler.h"
>  #include "llvm/MC/MCELFSymbolFlags.h"
>  #include "llvm/MC/MCFixupKindInfo.h"
>
> Removed: llvm/trunk/lib/MC/MCELF.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCELF.h?rev=169608&view=auto
> ==============================================================================
> --- llvm/trunk/lib/MC/MCELF.h (original)
> +++ llvm/trunk/lib/MC/MCELF.h (removed)
> @@ -1,35 +0,0 @@
> -//===- lib/MC/MCELF.h - ELF MC --------------------------------------------===//
> -//
> -//                     The LLVM Compiler Infrastructure
> -//
> -// This file is distributed under the University of Illinois Open Source
> -// License. See LICENSE.TXT for details.
> -//
> -//===----------------------------------------------------------------------===//
> -//
> -// This file contains some support functions used by the ELF Streamer and
> -// ObjectWriter.
> -//
> -//===----------------------------------------------------------------------===//
> -
> -#ifndef LLVM_MC_MCELF_H
> -#define LLVM_MC_MCELF_H
> -
> -#include "llvm/MC/MCExpr.h"
> -
> -namespace llvm {
> -class MCSymbolData;
> -
> -class MCELF {
> - public:
> -  static void SetBinding(MCSymbolData &SD, unsigned Binding);
> -  static unsigned GetBinding(const MCSymbolData &SD);
> -  static void SetType(MCSymbolData &SD, unsigned Type);
> -  static unsigned GetType(const MCSymbolData &SD);
> -  static void SetVisibility(MCSymbolData &SD, unsigned Visibility);
> -  static unsigned GetVisibility(MCSymbolData &SD);
> -};
> -
> -}
> -
> -#endif
>
> Modified: llvm/trunk/lib/MC/MCELFStreamer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCELFStreamer.cpp?rev=169609&r1=169608&r2=169609&view=diff
> ==============================================================================
> --- llvm/trunk/lib/MC/MCELFStreamer.cpp (original)
> +++ llvm/trunk/lib/MC/MCELFStreamer.cpp Fri Dec  7 10:50:23 2012
> @@ -12,15 +12,11 @@
>  //===----------------------------------------------------------------------===//
>
>  #include "llvm/MC/MCELFStreamer.h"
> -
> -#include "MCELF.h"
>  #include "llvm/ADT/SmallPtrSet.h"
> -#include "llvm/ADT/StringExtras.h"
> -#include "llvm/ADT/Twine.h"
> -#include "llvm/MC/MCAsmBackend.h"
>  #include "llvm/MC/MCAssembler.h"
>  #include "llvm/MC/MCCodeEmitter.h"
>  #include "llvm/MC/MCContext.h"
> +#include "llvm/MC/MCELF.h"
>  #include "llvm/MC/MCELFSymbolFlags.h"
>  #include "llvm/MC/MCExpr.h"
>  #include "llvm/MC/MCInst.h"
> @@ -104,15 +100,6 @@
>    llvm_unreachable("invalid assembler flag!");
>  }
>
> -void MCELFStreamer::EmitThumbFunc(MCSymbol *Func) {
> -  // FIXME: Anything needed here to flag the function as thumb?
> -
> -  getAssembler().setIsThumbFunc(Func);
> -
> -  MCSymbolData &SD = getAssembler().getOrCreateSymbolData(*Func);
> -  SD.setFlags(SD.getFlags() | ELF_Other_ThumbFunc);
> -}
> -
>  void MCELFStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
>    // TODO: This is exactly the same as WinCOFFStreamer. Consider merging into
>    // MCObjectStreamer.
> @@ -396,9 +383,7 @@
>
>    this->MCObjectStreamer::FinishImpl();
>  }
> -
> -void MCELFStreamer::EmitTCEntry(const MCSymbol &S)
> -{
> +void MCELFStreamer::EmitTCEntry(const MCSymbol &S) {
>    // Creates a R_PPC64_TOC relocation
>    MCObjectStreamer::EmitSymbolValue(&S, 8, 0);
>  }
> @@ -414,6 +399,10 @@
>    return S;
>  }
>
> +void MCELFStreamer::EmitThumbFunc(MCSymbol *Func) {
> +  llvm_unreachable("Generic ELF doesn't support this directive");
> +}
> +
>  void MCELFStreamer::EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {
>    llvm_unreachable("ELF doesn't support this directive");
>  }
>
> Added: llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp?rev=169609&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp (added)
> +++ llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp Fri Dec  7 10:50:23 2012
> @@ -0,0 +1,201 @@
> +//===- lib/MC/ARMELFStreamer.cpp - ELF Object Output for ARM --------------===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +//
> +// This file assembles .s files and emits ARM ELF .o object files. Different
> +// from generic ELF streamer in emitting mapping symbols ($a, $t and $d) to
> +// delimit regions of data and code.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#include "llvm/MC/MCELFStreamer.h"
> +#include "llvm/ADT/SmallPtrSet.h"
> +#include "llvm/ADT/StringExtras.h"
> +#include "llvm/MC/MCAssembler.h"
> +#include "llvm/MC/MCCodeEmitter.h"
> +#include "llvm/MC/MCContext.h"
> +#include "llvm/MC/MCSectionELF.h"
> +#include "llvm/MC/MCStreamer.h"
> +#include "llvm/MC/MCELF.h"
> +#include "llvm/MC/MCELFStreamer.h"
> +#include "llvm/MC/MCELFSymbolFlags.h"
> +#include "llvm/MC/MCExpr.h"
> +#include "llvm/MC/MCInst.h"
> +#include "llvm/MC/MCObjectStreamer.h"
> +#include "llvm/MC/MCSection.h"
> +#include "llvm/MC/MCSymbol.h"
> +#include "llvm/MC/MCValue.h"
> +#include "llvm/MC/MCAsmBackend.h"
> +#include "llvm/Support/Debug.h"
> +#include "llvm/Support/ELF.h"
> +#include "llvm/Support/ErrorHandling.h"
> +#include "llvm/Support/raw_ostream.h"
> +
> +using namespace llvm;
> +
> +namespace {
> +
> +/// Extend the generic ELFStreamer class so that it can emit mapping symbols at
> +/// the appropriate points in the object files. These symbols are defined in the
> +/// ARM ELF ABI: infocenter.arm.com/help/topic/com.arm.../IHI0044D_aaelf.pdf.
> +///
> +/// In brief: $a, $t or $d should be emitted at the start of each contiguous
> +/// region of ARM code, Thumb code or data in a section. In practice, this
> +/// emission does not rely on explicit assembler directives but on inherent
> +/// properties of the directives doing the emission (e.g. ".byte" is data, "add
> +/// r0, r0, r0" an instruction).
> +///
> +/// As a result this system is orthogonal to the DataRegion infrastructure used
> +/// by MachO. Beware!
> +class ARMELFStreamer : public MCELFStreamer {
> +public:
> +  ARMELFStreamer(MCContext &Context, MCAsmBackend &TAB,
> +                 raw_ostream &OS, MCCodeEmitter *Emitter, bool IsThumb)
> +    : MCELFStreamer(Context, TAB, OS, Emitter),
> +      IsThumb(IsThumb), MappingSymbolCounter(0), LastEMS(EMS_None) {
> +  }
> +
> +  ~ARMELFStreamer() {}
> +
> +  virtual void ChangeSection(const MCSection *Section) {
> +    // We have to keep track of the mapping symbol state of any sections we
> +    // use. Each one should start off as EMS_None, which is provided as the
> +    // default constructor by DenseMap::lookup.
> +    LastMappingSymbols[getPreviousSection()] = LastEMS;
> +    LastEMS = LastMappingSymbols.lookup(Section);
> +
> +    MCELFStreamer::ChangeSection(Section);
> +  }
> +
> +  /// This function is the one used to emit instruction data into the ELF
> +  /// streamer. We override it to add the appropriate mapping symbol if
> +  /// necessary.
> +  virtual void EmitInstruction(const MCInst& Inst) {
> +    if (IsThumb)
> +      EmitThumbMappingSymbol();
> +    else
> +      EmitARMMappingSymbol();
> +
> +    MCELFStreamer::EmitInstruction(Inst);
> +  }
> +
> +  /// This is one of the functions used to emit data into an ELF section, so the
> +  /// ARM streamer overrides it to add the appropriate mapping symbol ($d) if
> +  /// necessary.
> +  virtual void EmitBytes(StringRef Data, unsigned AddrSpace) {
> +    EmitDataMappingSymbol();
> +    MCELFStreamer::EmitBytes(Data, AddrSpace);
> +  }
> +
> +  /// This is one of the functions used to emit data into an ELF section, so the
> +  /// ARM streamer overrides it to add the appropriate mapping symbol ($d) if
> +  /// necessary.
> +  virtual void EmitValueImpl(const MCExpr *Value, unsigned Size,
> +                             unsigned AddrSpace) {
> +    EmitDataMappingSymbol();
> +    MCELFStreamer::EmitValueImpl(Value, Size, AddrSpace);
> +  }
> +
> +  virtual void EmitAssemblerFlag(MCAssemblerFlag Flag) {
> +    MCELFStreamer::EmitAssemblerFlag(Flag);
> +
> +    switch (Flag) {
> +    case MCAF_SyntaxUnified:
> +      return; // no-op here.
> +    case MCAF_Code16:
> +      IsThumb = true;
> +      return; // Change to Thumb mode
> +    case MCAF_Code32:
> +      IsThumb = false;
> +      return; // Change to ARM mode
> +    case MCAF_Code64:
> +      return;
> +    case MCAF_SubsectionsViaSymbols:
> +      return;
> +    }
> +  }
> +
> +private:
> +  enum ElfMappingSymbol {
> +    EMS_None,
> +    EMS_ARM,
> +    EMS_Thumb,
> +    EMS_Data
> +  };
> +
> +  void EmitDataMappingSymbol() {
> +    if (LastEMS == EMS_Data) return;
> +    EmitMappingSymbol("$d");
> +    LastEMS = EMS_Data;
> +  }
> +
> +  void EmitThumbMappingSymbol() {
> +    if (LastEMS == EMS_Thumb) return;
> +    EmitMappingSymbol("$t");
> +    LastEMS = EMS_Thumb;
> +  }
> +
> +  void EmitARMMappingSymbol() {
> +    if (LastEMS == EMS_ARM) return;
> +    EmitMappingSymbol("$a");
> +    LastEMS = EMS_ARM;
> +  }
> +
> +  void EmitMappingSymbol(StringRef Name) {
> +    MCSymbol *Start = getContext().CreateTempSymbol();
> +    EmitLabel(Start);
> +
> +    StringRef UniqueName = Name.str() + "." + itostr(MappingSymbolCounter++);
> +    MCSymbol *Symbol = getContext().GetOrCreateSymbol(UniqueName);
> +
> +    MCSymbolData &SD = getAssembler().getOrCreateSymbolData(*Symbol);
> +    MCELF::SetType(SD, ELF::STT_NOTYPE);
> +    MCELF::SetBinding(SD, ELF::STB_LOCAL);
> +    SD.setExternal(false);
> +    Symbol->setSection(*getCurrentSection());
> +
> +    const MCExpr *Value = MCSymbolRefExpr::Create(Start, getContext());
> +    Symbol->setVariableValue(Value);
> +  }
> +
> +  void EmitThumbFunc(MCSymbol *Func) {
> +    // FIXME: Anything needed here to flag the function as thumb?
> +
> +    getAssembler().setIsThumbFunc(Func);
> +
> +    MCSymbolData &SD = getAssembler().getOrCreateSymbolData(*Func);
> +    SD.setFlags(SD.getFlags() | ELF_Other_ThumbFunc);
> +  }
> +
> +
> +  bool IsThumb;
> +  int64_t MappingSymbolCounter;
> +
> +  DenseMap<const MCSection *, ElfMappingSymbol> LastMappingSymbols;
> +  ElfMappingSymbol LastEMS;
> +
> +  /// @}
> +};
> +}
> +
> +namespace llvm {
> +  MCELFStreamer* createARMELFStreamer(MCContext &Context, MCAsmBackend &TAB,
> +                                      raw_ostream &OS, MCCodeEmitter *Emitter,
> +                                      bool RelaxAll, bool NoExecStack,
> +                                      bool IsThumb) {
> +    ARMELFStreamer *S = new ARMELFStreamer(Context, TAB, OS, Emitter, IsThumb);
> +    if (RelaxAll)
> +      S->getAssembler().setRelaxAll(true);
> +    if (NoExecStack)
> +      S->getAssembler().setNoExecStack(true);
> +    return S;
> +  }
> +
> +}
> +
> +
>
> Propchange: llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
> Added: llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.h?rev=169609&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.h (added)
> +++ llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.h Fri Dec  7 10:50:23 2012
> @@ -0,0 +1,27 @@
> +//===-- ARMELFStreamer.h - ELF Streamer for ARM ------------*- C++ -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +//
> +// This file implements ELF streamer information for the ARM backend.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef ARM_ELF_STREAMER_H
> +#define ARM_ELF_STREAMER_H
> +
> +#include "llvm/MC/MCELFStreamer.h"
> +
> +namespace llvm {
> +
> +  MCELFStreamer* createARMELFStreamer(MCContext &Context, MCAsmBackend &TAB,
> +                                      raw_ostream &OS, MCCodeEmitter *Emitter,
> +                                      bool RelaxAll, bool NoExecStack,
> +                                      bool IsThumb);
> +}
> +
> +#endif // ARM_ELF_STREAMER_H
>
> Propchange: llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.h
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
> Modified: llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp?rev=169609&r1=169608&r2=169609&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp Fri Dec  7 10:50:23 2012
> @@ -12,6 +12,8 @@
>  //===----------------------------------------------------------------------===//
>
>  #include "ARMMCTargetDesc.h"
> +#include "ARMELFStreamer.h"
> +#include "ARMMCAsmInfo.h"
>  #include "ARMBaseInfo.h"
>  #include "ARMMCAsmInfo.h"
>  #include "InstPrinter/ARMInstPrinter.h"
> @@ -186,7 +188,8 @@
>      llvm_unreachable("ARM does not support Windows COFF format");
>    }
>
> -  return createELFStreamer(Ctx, MAB, OS, Emitter, false, NoExecStack);
> +  return createARMELFStreamer(Ctx, MAB, OS, Emitter, false, NoExecStack,
> +                              TheTriple.getArch() == Triple::thumb);
>  }
>
>  static MCInstPrinter *createARMMCInstPrinter(const Target &T,
>
> Modified: llvm/trunk/lib/Target/ARM/MCTargetDesc/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/MCTargetDesc/CMakeLists.txt?rev=169609&r1=169608&r2=169609&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/MCTargetDesc/CMakeLists.txt (original)
> +++ llvm/trunk/lib/Target/ARM/MCTargetDesc/CMakeLists.txt Fri Dec  7 10:50:23 2012
> @@ -1,6 +1,7 @@
>  add_llvm_library(LLVMARMDesc
>    ARMAsmBackend.cpp
>    ARMELFObjectWriter.cpp
> +  ARMELFStreamer.cpp
>    ARMMCAsmInfo.cpp
>    ARMMCCodeEmitter.cpp
>    ARMMCExpr.cpp
>
> Modified: llvm/trunk/test/CodeGen/ARM/2010-11-30-reloc-movt.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/2010-11-30-reloc-movt.ll?rev=169609&r1=169608&r2=169609&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/ARM/2010-11-30-reloc-movt.ll (original)
> +++ llvm/trunk/test/CodeGen/ARM/2010-11-30-reloc-movt.ll Fri Dec  7 10:50:23 2012
> @@ -23,7 +23,7 @@
>
>  ; OBJ:            Relocation 0
>  ; OBJ-NEXT:       'r_offset', 0x00000004
> -; OBJ-NEXT:       'r_sym', 0x000007
> +; OBJ-NEXT:       'r_sym', 0x000009
>  ; OBJ-NEXT:        'r_type', 0x2b
>
>  ; OBJ:          Relocation 1
> @@ -33,7 +33,7 @@
>
>  ; OBJ:          # Relocation 2
>  ; OBJ-NEXT:       'r_offset', 0x0000000c
> -; OBJ-NEXT:       'r_sym', 0x000008
> +; OBJ-NEXT:       'r_sym', 0x00000a
>  ; OBJ-NEXT:       'r_type', 0x1c
>
>  }
>
> Added: llvm/trunk/test/MC/ARM/data-in-code.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/data-in-code.ll?rev=169609&view=auto
> ==============================================================================
> --- llvm/trunk/test/MC/ARM/data-in-code.ll (added)
> +++ llvm/trunk/test/MC/ARM/data-in-code.ll Fri Dec  7 10:50:23 2012
> @@ -0,0 +1,176 @@
> +;; RUN: llc -O0 -mtriple=armv7-linux-gnueabi -filetype=obj %s -o - | \
> +;; RUN:   elf-dump | FileCheck -check-prefix=ARM %s
> +
> +;; RUN: llc -O0 -mtriple=thumbv7-linux-gnueabi -filetype=obj %s -o - | \
> +;; RUN:   elf-dump --dump-section-data | FileCheck -check-prefix=TMB %s
> +
> +;; Ensure that if a jump table is generated that it has Mapping Symbols
> +;; marking the data-in-code region.
> +
> +define void @foo(i32* %ptr) nounwind ssp {
> +  %tmp = load i32* %ptr, align 4
> +  switch i32 %tmp, label %default [
> +    i32 11, label %bb0
> +    i32 10, label %bb1
> +    i32 8, label %bb2
> +    i32 4, label %bb3
> +    i32 2, label %bb4
> +    i32 6, label %bb5
> +    i32 9, label %bb6
> +    i32 15, label %bb7
> +    i32 1, label %bb8
> +    i32 3, label %bb9
> +    i32 5, label %bb10
> +    i32 30, label %bb11
> +    i32 31, label %bb12
> +    i32 13, label %bb13
> +    i32 14, label %bb14
> +    i32 20, label %bb15
> +    i32 19, label %bb16
> +    i32 17, label %bb17
> +    i32 18, label %bb18
> +    i32 21, label %bb19
> +    i32 22, label %bb20
> +    i32 16, label %bb21
> +    i32 24, label %bb22
> +    i32 25, label %bb23
> +    i32 26, label %bb24
> +    i32 27, label %bb25
> +    i32 28, label %bb26
> +    i32 23, label %bb27
> +    i32 12, label %bb28
> +  ]
> +
> +default:
> +  br label %exit
> +bb0:
> +  br label %exit
> +bb1:
> +  br label %exit
> +bb2:
> +  br label %exit
> +bb3:
> +  br label %exit
> +bb4:
> +  br label %exit
> +bb5:
> +  br label %exit
> +bb6:
> +  br label %exit
> +bb7:
> +  br label %exit
> +bb8:
> +  br label %exit
> +bb9:
> +  br label %exit
> +bb10:
> +  br label %exit
> +bb11:
> +  br label %exit
> +bb12:
> +  br label %exit
> +bb13:
> +  br label %exit
> +bb14:
> +  br label %exit
> +bb15:
> +  br label %exit
> +bb16:
> +  br label %exit
> +bb17:
> +  br label %exit
> +bb18:
> +  br label %exit
> +bb19:
> +  br label %exit
> +bb20:
> +  br label %exit
> +bb21:
> +  br label %exit
> +bb22:
> +  br label %exit
> +bb23:
> +  br label %exit
> +bb24:
> +  br label %exit
> +bb25:
> +  br label %exit
> +bb26:
> +  br label %exit
> +bb27:
> +  br label %exit
> +bb28:
> +  br label %exit
> +
> +
> +exit:
> +
> +  ret void
> +}
> +
> +;; ARM:         # Symbol 2
> +;; ARM-NEXT:    $a
> +;; ARM-NEXT:   'st_value', 0x00000000
> +;; ARM-NEXT:   'st_size', 0x00000000
> +;; ARM-NEXT:   'st_bind', 0x0
> +;; ARM-NEXT:   'st_type', 0x0
> +;; ARM-NEXT:   'st_other'
> +;; ARM-NEXT:   'st_shndx', [[MIXED_SECT:0x[0-9a-f]+]]
> +
> +;; ARM:         # Symbol 3
> +;; ARM-NEXT:    $a
> +;; ARM-NEXT:   'st_value', 0x000000ac
> +;; ARM-NEXT:   'st_size', 0x00000000
> +;; ARM-NEXT:   'st_bind', 0x0
> +;; ARM-NEXT:   'st_type', 0x0
> +;; ARM-NEXT:   'st_other'
> +;; ARM-NEXT:   'st_shndx', [[MIXED_SECT]]
> +
> +;; ARM:         # Symbol 4
> +;; ARM-NEXT:    $d
> +;; ARM-NEXT:    'st_value', 0x00000000
> +;; ARM-NEXT:    'st_size', 0x00000000
> +;; ARM-NEXT:    'st_bind', 0x0
> +;; ARM-NEXT:    'st_type', 0x0
> +
> +;; ARM:         # Symbol 5
> +;; ARM-NEXT:    $d
> +;; ARM-NEXT:   'st_value', 0x00000030
> +;; ARM-NEXT:   'st_size', 0x00000000
> +;; ARM-NEXT:   'st_bind', 0x0
> +;; ARM-NEXT:   'st_type', 0x0
> +;; ARM-NEXT:   'st_other'
> +;; ARM-NEXT:   'st_shndx', [[MIXED_SECT]]
> +
> +;; ARM-NOT:     ${{[atd]}}
> +
> +;; TMB:         # Symbol 3
> +;; TMB-NEXT:    $d
> +;; TMB-NEXT:   'st_value', 0x00000016
> +;; TMB-NEXT:   'st_size', 0x00000000
> +;; TMB-NEXT:   'st_bind', 0x0
> +;; TMB-NEXT:   'st_type', 0x0
> +;; TMB-NEXT:   'st_other'
> +;; TMB-NEXT:   'st_shndx', [[MIXED_SECT:0x[0-9a-f]+]]
> +
> +;; TMB:         # Symbol 4
> +;; TMB-NEXT:    $t
> +;; TMB-NEXT:   'st_value', 0x00000000
> +;; TMB-NEXT:   'st_size', 0x00000000
> +;; TMB-NEXT:   'st_bind', 0x0
> +;; TMB-NEXT:   'st_type', 0x0
> +;; TMB-NEXT:   'st_other'
> +;; TMB-NEXT:   'st_shndx', [[MIXED_SECT]]
> +
> +;; TMB:         # Symbol 5
> +;; TMB-NEXT:    $t
> +;; TMB-NEXT:   'st_value', 0x00000036
> +;; TMB-NEXT:   'st_size', 0x00000000
> +;; TMB-NEXT:   'st_bind', 0x0
> +;; TMB-NEXT:   'st_type', 0x0
> +;; TMB-NEXT:   'st_other'
> +;; TMB-NEXT:   'st_shndx', [[MIXED_SECT]]
> +
> +
> +;; TMB-NOT:     ${{[atd]}}
> +
>
> Propchange: llvm/trunk/test/MC/ARM/data-in-code.ll
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
> 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=169609&r1=169608&r2=169609&view=diff
> ==============================================================================
> --- llvm/trunk/test/MC/ARM/elf-reloc-01.ll (original)
> +++ llvm/trunk/test/MC/ARM/elf-reloc-01.ll Fri Dec  7 10:50:23 2012
> @@ -62,9 +62,9 @@
>
>  ;; OBJ:          Relocation 1
>  ;; OBJ-NEXT:     'r_offset',
> -;; OBJ-NEXT:     'r_sym', 0x000002
> +;; OBJ-NEXT:     'r_sym', 0x000007
>  ;; OBJ-NEXT:     'r_type', 0x2b
>
> -;; OBJ:         Symbol 2
> +;; OBJ:         Symbol 7
>  ;; OBJ-NEXT:    '_MergedGlobals'
>  ;; OBJ-NEXT:    'st_value', 0x00000010
>
> Modified: llvm/trunk/test/MC/ARM/elf-reloc-02.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/elf-reloc-02.ll?rev=169609&r1=169608&r2=169609&view=diff
> ==============================================================================
> --- llvm/trunk/test/MC/ARM/elf-reloc-02.ll (original)
> +++ llvm/trunk/test/MC/ARM/elf-reloc-02.ll Fri Dec  7 10:50:23 2012
> @@ -42,9 +42,9 @@
>  declare void @exit(i32) noreturn nounwind
>
>  ;; OBJ:        Relocation 0
> -;; OBJ-NEXT:    'r_offset',
> -;; OBJ-NEXT:    'r_sym', 0x000002
> +;; OBJ-NEXT:    'r_offset',
> +;; OBJ-NEXT:    'r_sym', 0x000005
>  ;; OBJ-NEXT:    'r_type', 0x2b
>
> -;; OBJ:          Symbol 2
> +;; OBJ:          Symbol 5
>  ;; OBJ-NEXT:    '.L.str'
>
> Modified: llvm/trunk/test/MC/ARM/elf-reloc-03.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/elf-reloc-03.ll?rev=169609&r1=169608&r2=169609&view=diff
> ==============================================================================
> --- llvm/trunk/test/MC/ARM/elf-reloc-03.ll (original)
> +++ llvm/trunk/test/MC/ARM/elf-reloc-03.ll Fri Dec  7 10:50:23 2012
> @@ -89,9 +89,9 @@
>  declare void @exit(i32) noreturn nounwind
>
>  ;; OBJ:           Relocation 1
> -;; OBJ-NEXT:     'r_offset',
> -;; OBJ-NEXT:     'r_sym', 0x00000c
> +;; OBJ-NEXT:     'r_offset',
> +;; OBJ-NEXT:     'r_sym', 0x000010
>  ;; OBJ-NEXT:     'r_type', 0x2b
>
> -;; OBJ:      Symbol 12
> +;; OBJ:      Symbol 16
>  ;; OBJ-NEXT:    'vtable'
>
> Modified: llvm/trunk/test/MC/ARM/elf-reloc-condcall.s
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/elf-reloc-condcall.s?rev=169609&r1=169608&r2=169609&view=diff
> ==============================================================================
> --- llvm/trunk/test/MC/ARM/elf-reloc-condcall.s (original)
> +++ llvm/trunk/test/MC/ARM/elf-reloc-condcall.s Fri Dec  7 10:50:23 2012
> @@ -9,25 +9,25 @@
>  // OBJ: .rel.text
>
>  // OBJ: 'r_offset', 0x00000000
> -// OBJ-NEXT:  'r_sym', 0x000004
> +// OBJ-NEXT:  'r_sym', 0x000005
>  // OBJ-NEXT: 'r_type', 0x1d
>
>  // OBJ: 'r_offset', 0x00000004
> -// OBJ-NEXT:  'r_sym', 0x000004
> +// OBJ-NEXT:  'r_sym', 0x000005
>  // OBJ-NEXT: 'r_type', 0x1c
>
>  // OBJ: 'r_offset', 0x00000008
> -// OBJ-NEXT:  'r_sym', 0x000004
> +// OBJ-NEXT:  'r_sym', 0x000005
>  // OBJ-NEXT: 'r_type', 0x1c
>
>  // OBJ: 'r_offset', 0x0000000c
> -// OBJ-NEXT:  'r_sym', 0x000004
> +// OBJ-NEXT:  'r_sym', 0x000005
>  // OBJ-NEXT: 'r_type', 0x1d
>
>  // OBJ: 'r_offset', 0x00000010
> -// OBJ-NEXT:  'r_sym', 0x000004
> +// OBJ-NEXT:  'r_sym', 0x000005
>  // OBJ-NEXT: 'r_type', 0x1d
>
>  // OBJ: .symtab
> -// OBJ: Symbol 4
> +// OBJ: Symbol 5
>  // OBJ-NEXT: some_label
>
> Modified: llvm/trunk/test/MC/ARM/elf-thumbfunc-reloc.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/elf-thumbfunc-reloc.ll?rev=169609&r1=169608&r2=169609&view=diff
> ==============================================================================
> --- llvm/trunk/test/MC/ARM/elf-thumbfunc-reloc.ll (original)
> +++ llvm/trunk/test/MC/ARM/elf-thumbfunc-reloc.ll Fri Dec  7 10:50:23 2012
> @@ -28,10 +28,10 @@
>  ; 00000008  0000070a R_ARM_THM_CALL    00000001   foo
>  ; CHECK:           Relocation 0
>  ; CHECK-NEXT:      'r_offset', 0x00000008
> -; CHECK-NEXT:      'r_sym', 0x000007
> +; CHECK-NEXT:      'r_sym', 0x000009
>  ; CHECK-NEXT:      'r_type', 0x0a
>
>  ; make sure foo is thumb function: bit 0 = 1
> -; CHECK:           Symbol 7
> +; CHECK:           Symbol 9
>  ; CHECK-NEXT:      'foo'
>  ; CHECK-NEXT:      'st_value', 0x00000001
>
> Modified: llvm/trunk/test/MC/ARM/elf-thumbfunc.s
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/elf-thumbfunc.s?rev=169609&r1=169608&r2=169609&view=diff
> ==============================================================================
> --- llvm/trunk/test/MC/ARM/elf-thumbfunc.s (original)
> +++ llvm/trunk/test/MC/ARM/elf-thumbfunc.s Fri Dec  7 10:50:23 2012
> @@ -12,7 +12,7 @@
>         bx      lr
>
>  @@ make sure foo is thumb function: bit 0 = 1 (st_value)
> - at CHECK:           Symbol 4
> + at CHECK:           Symbol 5
>  @CHECK-NEXT:      'st_name', 0x00000001
>  @CHECK-NEXT:      'st_value', 0x00000001
>  @CHECK-NEXT:      'st_size', 0x00000000
>
> Added: llvm/trunk/test/MC/ARM/mapping-within-section.s
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/mapping-within-section.s?rev=169609&view=auto
> ==============================================================================
> --- llvm/trunk/test/MC/ARM/mapping-within-section.s (added)
> +++ llvm/trunk/test/MC/ARM/mapping-within-section.s Fri Dec  7 10:50:23 2012
> @@ -0,0 +1,33 @@
> +@ RUN: llvm-mc -triple=arm-linux-gnueabi -filetype=obj < %s | llvm-objdump -t - | FileCheck %s
> +
> +    .text
> +@ $a at 0x0000
> +    add r0, r0, r0
> +@ $d at 0x0004
> +    .word 42
> +    .thumb
> +@ $t at 0x0008
> +    adds r0, r0, r0
> +    adds r0, r0, r0
> +@ $a at 0x000c
> +    .arm
> +    add r0, r0, r0
> +@ $t at 0x0010
> +    .thumb
> +    adds r0, r0, r0
> +@ $d at 0x0012
> +    .ascii "012"
> +    .byte 1
> +    .byte 2
> +    .byte 3
> +@ $a at 0x0018
> +    .arm
> +    add r0, r0, r0
> +
> +@ CHECK:      00000000         .text  00000000 $a
> +@ CHECK-NEXT: 0000000c         .text  00000000 $a
> +@ CHECK-NEXT: 00000018         .text  00000000 $a
> +@ CHECK-NEXT: 00000004         .text  00000000 $d
> +@ CHECK-NEXT: 00000012         .text  00000000 $d
> +@ CHECK-NEXT: 00000008         .text  00000000 $t
> +@ CHECK-NEXT: 00000010         .text  00000000 $t
>
> Propchange: llvm/trunk/test/MC/ARM/mapping-within-section.s
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
> Added: llvm/trunk/test/MC/ARM/multi-section-mapping.s
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/multi-section-mapping.s?rev=169609&view=auto
> ==============================================================================
> --- llvm/trunk/test/MC/ARM/multi-section-mapping.s (added)
> +++ llvm/trunk/test/MC/ARM/multi-section-mapping.s Fri Dec  7 10:50:23 2012
> @@ -0,0 +1,35 @@
> +@ RUN: llvm-mc -triple=arm-linux-gnueabi -filetype=obj < %s | llvm-objdump -t - | FileCheck %s
> +
> +        .text
> +        add r0, r0, r0
> +
> +@ .wibble should *not* inherit .text's mapping symbol. It's a completely different section.
> +        .section .wibble
> +        add r0, r0, r0
> +
> +@ A section should be able to start with a $t
> +        .section .starts_thumb
> +        .thumb
> +        adds r0, r0, r0
> +
> +@ A setion should be able to start with a $d
> +        .section .starts_data
> +        .word 42
> +
> +@ Changing back to .text should not emit a redundant $a
> +        .text
> +        .arm
> +        add r0, r0, r0
> +
> +@ With all those constraints, we want:
> +@   + .text to have $a at 0 and no others
> +@   + .wibble to have $a at 0
> +@   + .starts_thumb to have $t at 0
> +@   + .starts_data to have $d at 0
> +
> +@ CHECK: 00000000 .text 00000000 $a
> +@ CHECK-NEXT: 00000000 .wibble 00000000 $a
> +@ CHECK-NEXT: 00000000 .starts_data 00000000 $d
> +@ CHECK-NEXT: 00000000 .starts_thumb 00000000 $t
> +@ CHECK-NOT: ${{[adt]}}
> +
>
> Propchange: llvm/trunk/test/MC/ARM/multi-section-mapping.s
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
> Added: llvm/trunk/test/MC/ARM/relocated-mapping.s
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/relocated-mapping.s?rev=169609&view=auto
> ==============================================================================
> --- llvm/trunk/test/MC/ARM/relocated-mapping.s (added)
> +++ llvm/trunk/test/MC/ARM/relocated-mapping.s Fri Dec  7 10:50:23 2012
> @@ -0,0 +1,11 @@
> +@ RUN: llvm-mc -triple=arm-linux-gnueabi -filetype=obj < %s | llvm-objdump -t - | FileCheck %s
> +
> +@ Implementation-detail test (unfortunately): values that are relocated do not
> +@ go via MCStreamer::EmitBytes; make sure they still emit a mapping symbol.
> +        add r0, r0, r0
> +        .word somewhere
> +        add r0, r0, r0
> +
> +@ CHECK: 00000000 .text 00000000 $a
> +@ CHECK-NEXT: 00000008 .text 00000000 $a
> +@ CHECK-NEXT: 00000004 .text 00000000 $d
>
> Propchange: llvm/trunk/test/MC/ARM/relocated-mapping.s
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



-- 
cheers,
--renato

http://systemcall.org/



More information about the llvm-commits mailing list