mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-30 16:17:05 +00:00 
			
		
		
		
	Add ARM big endian Target (armeb, thumbeb)
Reviewed at http://llvm-reviews.chandlerc.com/D3095 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205007 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		| @@ -46,7 +46,8 @@ public: | |||||||
|   enum ArchType { |   enum ArchType { | ||||||
|     UnknownArch, |     UnknownArch, | ||||||
|  |  | ||||||
|     arm,        // ARM: arm, armv.*, xscale |     arm,        // ARM (little endian): arm, armv.*, xscale | ||||||
|  |     armeb,      // ARM (big endian): armeb | ||||||
|     aarch64,    // AArch64 (little endian): aarch64 |     aarch64,    // AArch64 (little endian): aarch64 | ||||||
|     aarch64_be, // AArch64 (big endian): aarch64_be |     aarch64_be, // AArch64 (big endian): aarch64_be | ||||||
|     hexagon,    // Hexagon: hexagon |     hexagon,    // Hexagon: hexagon | ||||||
| @@ -63,7 +64,8 @@ public: | |||||||
|     sparcv9,    // Sparcv9: Sparcv9 |     sparcv9,    // Sparcv9: Sparcv9 | ||||||
|     systemz,    // SystemZ: s390x |     systemz,    // SystemZ: s390x | ||||||
|     tce,        // TCE (http://tce.cs.tut.fi/): tce |     tce,        // TCE (http://tce.cs.tut.fi/): tce | ||||||
|     thumb,      // Thumb: thumb, thumbv.* |     thumb,      // Thumb (little endian): thumb, thumbv.* | ||||||
|  |     thumbeb,    // Thumb (big endian): thumbeb | ||||||
|     x86,        // X86: i[3-9]86 |     x86,        // X86: i[3-9]86 | ||||||
|     x86_64,     // X86-64: amd64, x86_64 |     x86_64,     // X86-64: amd64, x86_64 | ||||||
|     xcore,      // XCore: xcore |     xcore,      // XCore: xcore | ||||||
|   | |||||||
| @@ -508,7 +508,7 @@ uint8_t *RuntimeDyldImpl::createStubFunction(uint8_t *Addr) { | |||||||
|     *StubAddr = 0xd61f0200; // br ip0 |     *StubAddr = 0xd61f0200; // br ip0 | ||||||
|  |  | ||||||
|     return Addr; |     return Addr; | ||||||
|   } else if (Arch == Triple::arm) { |   } else if (Arch == Triple::arm || Arch == Triple::armeb) { | ||||||
|     // TODO: There is only ARM far stub now. We should add the Thumb stub, |     // TODO: There is only ARM far stub now. We should add the Thumb stub, | ||||||
|     // and stubs for branches Thumb - ARM and ARM - Thumb. |     // and stubs for branches Thumb - ARM and ARM - Thumb. | ||||||
|     uint32_t *StubAddr = (uint32_t *)Addr; |     uint32_t *StubAddr = (uint32_t *)Addr; | ||||||
|   | |||||||
| @@ -848,7 +848,9 @@ void RuntimeDyldELF::resolveRelocation(const SectionEntry &Section, | |||||||
|     resolveAArch64Relocation(Section, Offset, Value, Type, Addend); |     resolveAArch64Relocation(Section, Offset, Value, Type, Addend); | ||||||
|     break; |     break; | ||||||
|   case Triple::arm: // Fall through. |   case Triple::arm: // Fall through. | ||||||
|  |   case Triple::armeb: | ||||||
|   case Triple::thumb: |   case Triple::thumb: | ||||||
|  |   case Triple::thumbeb: | ||||||
|     resolveARMRelocation(Section, Offset, (uint32_t)(Value & 0xffffffffL), Type, |     resolveARMRelocation(Section, Offset, (uint32_t)(Value & 0xffffffffL), Type, | ||||||
|                          (uint32_t)(Addend & 0xffffffffL)); |                          (uint32_t)(Addend & 0xffffffffL)); | ||||||
|     break; |     break; | ||||||
|   | |||||||
| @@ -22,6 +22,7 @@ const char *Triple::getArchTypeName(ArchType Kind) { | |||||||
|   case aarch64:     return "aarch64"; |   case aarch64:     return "aarch64"; | ||||||
|   case aarch64_be:  return "aarch64_be"; |   case aarch64_be:  return "aarch64_be"; | ||||||
|   case arm:         return "arm"; |   case arm:         return "arm"; | ||||||
|  |   case armeb:       return "armeb"; | ||||||
|   case hexagon:     return "hexagon"; |   case hexagon:     return "hexagon"; | ||||||
|   case mips:        return "mips"; |   case mips:        return "mips"; | ||||||
|   case mipsel:      return "mipsel"; |   case mipsel:      return "mipsel"; | ||||||
| @@ -37,6 +38,7 @@ const char *Triple::getArchTypeName(ArchType Kind) { | |||||||
|   case systemz:     return "s390x"; |   case systemz:     return "s390x"; | ||||||
|   case tce:         return "tce"; |   case tce:         return "tce"; | ||||||
|   case thumb:       return "thumb"; |   case thumb:       return "thumb"; | ||||||
|  |   case thumbeb:     return "thumbeb"; | ||||||
|   case x86:         return "i386"; |   case x86:         return "i386"; | ||||||
|   case x86_64:      return "x86_64"; |   case x86_64:      return "x86_64"; | ||||||
|   case xcore:       return "xcore"; |   case xcore:       return "xcore"; | ||||||
| @@ -60,7 +62,9 @@ const char *Triple::getArchTypePrefix(ArchType Kind) { | |||||||
|   case aarch64_be:  return "aarch64"; |   case aarch64_be:  return "aarch64"; | ||||||
|  |  | ||||||
|   case arm: |   case arm: | ||||||
|   case thumb:       return "arm"; |   case armeb: | ||||||
|  |   case thumb: | ||||||
|  |   case thumbeb:     return "arm"; | ||||||
|  |  | ||||||
|   case ppc64: |   case ppc64: | ||||||
|   case ppc64le: |   case ppc64le: | ||||||
| @@ -168,6 +172,7 @@ Triple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) { | |||||||
|     .Case("aarch64", aarch64) |     .Case("aarch64", aarch64) | ||||||
|     .Case("aarch64_be", aarch64_be) |     .Case("aarch64_be", aarch64_be) | ||||||
|     .Case("arm", arm) |     .Case("arm", arm) | ||||||
|  |     .Case("armeb", armeb) | ||||||
|     .Case("mips", mips) |     .Case("mips", mips) | ||||||
|     .Case("mipsel", mipsel) |     .Case("mipsel", mipsel) | ||||||
|     .Case("mips64", mips64) |     .Case("mips64", mips64) | ||||||
| @@ -184,6 +189,7 @@ Triple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) { | |||||||
|     .Case("systemz", systemz) |     .Case("systemz", systemz) | ||||||
|     .Case("tce", tce) |     .Case("tce", tce) | ||||||
|     .Case("thumb", thumb) |     .Case("thumb", thumb) | ||||||
|  |     .Case("thumbeb", thumbeb) | ||||||
|     .Case("x86", x86) |     .Case("x86", x86) | ||||||
|     .Case("x86-64", x86_64) |     .Case("x86-64", x86_64) | ||||||
|     .Case("xcore", xcore) |     .Case("xcore", xcore) | ||||||
| @@ -212,6 +218,7 @@ const char *Triple::getArchNameForAssembler() { | |||||||
|     .Cases("armv5", "armv5e", "thumbv5", "thumbv5e", "armv5") |     .Cases("armv5", "armv5e", "thumbv5", "thumbv5e", "armv5") | ||||||
|     .Cases("armv6", "thumbv6", "armv6") |     .Cases("armv6", "thumbv6", "armv6") | ||||||
|     .Cases("armv7", "thumbv7", "armv7") |     .Cases("armv7", "thumbv7", "armv7") | ||||||
|  |     .Case("armeb", "armeb") | ||||||
|     .Case("r600", "r600") |     .Case("r600", "r600") | ||||||
|     .Case("nvptx", "nvptx") |     .Case("nvptx", "nvptx") | ||||||
|     .Case("nvptx64", "nvptx64") |     .Case("nvptx64", "nvptx64") | ||||||
| @@ -237,8 +244,12 @@ static Triple::ArchType parseArch(StringRef ArchName) { | |||||||
|     // FIXME: It would be good to replace these with explicit names for all the |     // FIXME: It would be good to replace these with explicit names for all the | ||||||
|     // various suffixes supported. |     // various suffixes supported. | ||||||
|     .StartsWith("armv", Triple::arm) |     .StartsWith("armv", Triple::arm) | ||||||
|  |     .Case("armeb", Triple::armeb) | ||||||
|  |     .StartsWith("armebv", Triple::armeb) | ||||||
|     .Case("thumb", Triple::thumb) |     .Case("thumb", Triple::thumb) | ||||||
|     .StartsWith("thumbv", Triple::thumb) |     .StartsWith("thumbv", Triple::thumb) | ||||||
|  |     .Case("thumbeb", Triple::thumbeb) | ||||||
|  |     .StartsWith("thumbebv", Triple::thumbeb) | ||||||
|     .Case("msp430", Triple::msp430) |     .Case("msp430", Triple::msp430) | ||||||
|     .Cases("mips", "mipseb", "mipsallegrex", Triple::mips) |     .Cases("mips", "mipseb", "mipsallegrex", Triple::mips) | ||||||
|     .Cases("mipsel", "mipsallegrexel", Triple::mipsel) |     .Cases("mipsel", "mipsallegrexel", Triple::mipsel) | ||||||
| @@ -743,6 +754,7 @@ static unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch) { | |||||||
|  |  | ||||||
|   case llvm::Triple::amdil: |   case llvm::Triple::amdil: | ||||||
|   case llvm::Triple::arm: |   case llvm::Triple::arm: | ||||||
|  |   case llvm::Triple::armeb: | ||||||
|   case llvm::Triple::hexagon: |   case llvm::Triple::hexagon: | ||||||
|   case llvm::Triple::le32: |   case llvm::Triple::le32: | ||||||
|   case llvm::Triple::mips: |   case llvm::Triple::mips: | ||||||
| @@ -753,6 +765,7 @@ static unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch) { | |||||||
|   case llvm::Triple::sparc: |   case llvm::Triple::sparc: | ||||||
|   case llvm::Triple::tce: |   case llvm::Triple::tce: | ||||||
|   case llvm::Triple::thumb: |   case llvm::Triple::thumb: | ||||||
|  |   case llvm::Triple::thumbeb: | ||||||
|   case llvm::Triple::x86: |   case llvm::Triple::x86: | ||||||
|   case llvm::Triple::xcore: |   case llvm::Triple::xcore: | ||||||
|   case llvm::Triple::spir: |   case llvm::Triple::spir: | ||||||
| @@ -801,6 +814,7 @@ Triple Triple::get32BitArchVariant() const { | |||||||
|   case Triple::amdil: |   case Triple::amdil: | ||||||
|   case Triple::spir: |   case Triple::spir: | ||||||
|   case Triple::arm: |   case Triple::arm: | ||||||
|  |   case Triple::armeb: | ||||||
|   case Triple::hexagon: |   case Triple::hexagon: | ||||||
|   case Triple::le32: |   case Triple::le32: | ||||||
|   case Triple::mips: |   case Triple::mips: | ||||||
| @@ -811,6 +825,7 @@ Triple Triple::get32BitArchVariant() const { | |||||||
|   case Triple::sparc: |   case Triple::sparc: | ||||||
|   case Triple::tce: |   case Triple::tce: | ||||||
|   case Triple::thumb: |   case Triple::thumb: | ||||||
|  |   case Triple::thumbeb: | ||||||
|   case Triple::x86: |   case Triple::x86: | ||||||
|   case Triple::xcore: |   case Triple::xcore: | ||||||
|     // Already 32-bit. |     // Already 32-bit. | ||||||
| @@ -833,12 +848,14 @@ Triple Triple::get64BitArchVariant() const { | |||||||
|   case Triple::UnknownArch: |   case Triple::UnknownArch: | ||||||
|   case Triple::amdil: |   case Triple::amdil: | ||||||
|   case Triple::arm: |   case Triple::arm: | ||||||
|  |   case Triple::armeb: | ||||||
|   case Triple::hexagon: |   case Triple::hexagon: | ||||||
|   case Triple::le32: |   case Triple::le32: | ||||||
|   case Triple::msp430: |   case Triple::msp430: | ||||||
|   case Triple::r600: |   case Triple::r600: | ||||||
|   case Triple::tce: |   case Triple::tce: | ||||||
|   case Triple::thumb: |   case Triple::thumb: | ||||||
|  |   case Triple::thumbeb: | ||||||
|   case Triple::xcore: |   case Triple::xcore: | ||||||
|     T.setArch(UnknownArch); |     T.setArch(UnknownArch); | ||||||
|     break; |     break; | ||||||
|   | |||||||
| @@ -1719,6 +1719,8 @@ void ARMAsmPrinter::EmitInstruction(const MachineInstr *MI) { | |||||||
|  |  | ||||||
| // Force static initialization. | // Force static initialization. | ||||||
| extern "C" void LLVMInitializeARMAsmPrinter() { | extern "C" void LLVMInitializeARMAsmPrinter() { | ||||||
|   RegisterAsmPrinter<ARMAsmPrinter> X(TheARMTarget); |   RegisterAsmPrinter<ARMAsmPrinter> X(TheARMleTarget); | ||||||
|   RegisterAsmPrinter<ARMAsmPrinter> Y(TheThumbTarget); |   RegisterAsmPrinter<ARMAsmPrinter> Y(TheARMbeTarget); | ||||||
|  |   RegisterAsmPrinter<ARMAsmPrinter> A(TheThumbleTarget); | ||||||
|  |   RegisterAsmPrinter<ARMAsmPrinter> B(TheThumbbeTarget); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -75,12 +75,14 @@ IT(cl::desc("IT block support"), cl::Hidden, cl::init(DefaultIT), | |||||||
|               clEnumValEnd)); |               clEnumValEnd)); | ||||||
|  |  | ||||||
| ARMSubtarget::ARMSubtarget(const std::string &TT, const std::string &CPU, | ARMSubtarget::ARMSubtarget(const std::string &TT, const std::string &CPU, | ||||||
|                            const std::string &FS, const TargetOptions &Options) |                            const std::string &FS, bool IsLittle, | ||||||
|  |                            const TargetOptions &Options) | ||||||
|   : ARMGenSubtargetInfo(TT, CPU, FS) |   : ARMGenSubtargetInfo(TT, CPU, FS) | ||||||
|   , ARMProcFamily(Others) |   , ARMProcFamily(Others) | ||||||
|   , ARMProcClass(None) |   , ARMProcClass(None) | ||||||
|   , stackAlignment(4) |   , stackAlignment(4) | ||||||
|   , CPUString(CPU) |   , CPUString(CPU) | ||||||
|  |   , IsLittle(IsLittle) | ||||||
|   , TargetTriple(TT) |   , TargetTriple(TT) | ||||||
|   , Options(Options) |   , Options(Options) | ||||||
|   , TargetABI(ARM_ABI_UNKNOWN) { |   , TargetABI(ARM_ABI_UNKNOWN) { | ||||||
|   | |||||||
| @@ -203,6 +203,9 @@ protected: | |||||||
|   /// CPUString - String name of used CPU. |   /// CPUString - String name of used CPU. | ||||||
|   std::string CPUString; |   std::string CPUString; | ||||||
|  |  | ||||||
|  |   /// IsLittle - The target is Little Endian | ||||||
|  |   bool IsLittle; | ||||||
|  |  | ||||||
|   /// TargetTriple - What processor and OS we're targeting. |   /// TargetTriple - What processor and OS we're targeting. | ||||||
|   Triple TargetTriple; |   Triple TargetTriple; | ||||||
|  |  | ||||||
| @@ -226,7 +229,8 @@ protected: | |||||||
|   /// of the specified triple. |   /// of the specified triple. | ||||||
|   /// |   /// | ||||||
|   ARMSubtarget(const std::string &TT, const std::string &CPU, |   ARMSubtarget(const std::string &TT, const std::string &CPU, | ||||||
|                const std::string &FS, const TargetOptions &Options); |                const std::string &FS, bool IsLittle, | ||||||
|  |                const TargetOptions &Options); | ||||||
|  |  | ||||||
|   /// getMaxInlineSizeThreshold - Returns the maximum memset / memcpy size |   /// getMaxInlineSizeThreshold - Returns the maximum memset / memcpy size | ||||||
|   /// that still makes it profitable to inline the call. |   /// that still makes it profitable to inline the call. | ||||||
| @@ -375,6 +379,8 @@ public: | |||||||
|  |  | ||||||
|   const std::string & getCPUString() const { return CPUString; } |   const std::string & getCPUString() const { return CPUString; } | ||||||
|  |  | ||||||
|  |   bool isLittle() const { return IsLittle; } | ||||||
|  |  | ||||||
|   unsigned getMispredictionPenalty() const; |   unsigned getMispredictionPenalty() const; | ||||||
|    |    | ||||||
|   /// This function returns true if the target has sincos() routine in its |   /// This function returns true if the target has sincos() routine in its | ||||||
|   | |||||||
| @@ -30,8 +30,10 @@ DisableA15SDOptimization("disable-a15-sd-optimization", cl::Hidden, | |||||||
|  |  | ||||||
| extern "C" void LLVMInitializeARMTarget() { | extern "C" void LLVMInitializeARMTarget() { | ||||||
|   // Register the target. |   // Register the target. | ||||||
|   RegisterTargetMachine<ARMTargetMachine> X(TheARMTarget); |   RegisterTargetMachine<ARMleTargetMachine> X(TheARMleTarget); | ||||||
|   RegisterTargetMachine<ThumbTargetMachine> Y(TheThumbTarget); |   RegisterTargetMachine<ARMbeTargetMachine> Y(TheARMbeTarget); | ||||||
|  |   RegisterTargetMachine<ThumbleTargetMachine> A(TheThumbleTarget); | ||||||
|  |   RegisterTargetMachine<ThumbbeTargetMachine> B(TheThumbbeTarget); | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -41,9 +43,10 @@ ARMBaseTargetMachine::ARMBaseTargetMachine(const Target &T, StringRef TT, | |||||||
|                                            StringRef CPU, StringRef FS, |                                            StringRef CPU, StringRef FS, | ||||||
|                                            const TargetOptions &Options, |                                            const TargetOptions &Options, | ||||||
|                                            Reloc::Model RM, CodeModel::Model CM, |                                            Reloc::Model RM, CodeModel::Model CM, | ||||||
|                                            CodeGenOpt::Level OL) |                                            CodeGenOpt::Level OL, | ||||||
|  |                                            bool isLittle) | ||||||
|   : LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL), |   : LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL), | ||||||
|     Subtarget(TT, CPU, FS, Options), |     Subtarget(TT, CPU, FS, isLittle, Options), | ||||||
|     JITInfo(), |     JITInfo(), | ||||||
|     InstrItins(Subtarget.getInstrItineraryData()) { |     InstrItins(Subtarget.getInstrItineraryData()) { | ||||||
|  |  | ||||||
| @@ -65,8 +68,14 @@ void ARMBaseTargetMachine::addAnalysisPasses(PassManagerBase &PM) { | |||||||
| void ARMTargetMachine::anchor() { } | void ARMTargetMachine::anchor() { } | ||||||
|  |  | ||||||
| static std::string computeDataLayout(ARMSubtarget &ST) { | static std::string computeDataLayout(ARMSubtarget &ST) { | ||||||
|  |   std::string Ret = ""; | ||||||
|  |  | ||||||
|  |   if (ST.isLittle()) | ||||||
|     // Little endian. |     // Little endian. | ||||||
|   std::string Ret = "e"; |     Ret += "e"; | ||||||
|  |   else | ||||||
|  |     // Big endian. | ||||||
|  |     Ret += "E"; | ||||||
|  |  | ||||||
|   Ret += DataLayout::getManglingComponent(ST.getTargetTriple()); |   Ret += DataLayout::getManglingComponent(ST.getTargetTriple()); | ||||||
|  |  | ||||||
| @@ -118,8 +127,9 @@ ARMTargetMachine::ARMTargetMachine(const Target &T, StringRef TT, | |||||||
|                                    StringRef CPU, StringRef FS, |                                    StringRef CPU, StringRef FS, | ||||||
|                                    const TargetOptions &Options, |                                    const TargetOptions &Options, | ||||||
|                                    Reloc::Model RM, CodeModel::Model CM, |                                    Reloc::Model RM, CodeModel::Model CM, | ||||||
|                                    CodeGenOpt::Level OL) |                                    CodeGenOpt::Level OL, | ||||||
|   : ARMBaseTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL), |                                    bool isLittle) | ||||||
|  |   : ARMBaseTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, isLittle), | ||||||
|     InstrInfo(Subtarget), |     InstrInfo(Subtarget), | ||||||
|     DL(computeDataLayout(Subtarget)), |     DL(computeDataLayout(Subtarget)), | ||||||
|     TLInfo(*this), |     TLInfo(*this), | ||||||
| @@ -131,14 +141,33 @@ ARMTargetMachine::ARMTargetMachine(const Target &T, StringRef TT, | |||||||
|                        "support ARM mode execution!"); |                        "support ARM mode execution!"); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void ARMleTargetMachine::anchor() { } | ||||||
|  |  | ||||||
|  | ARMleTargetMachine:: | ||||||
|  | ARMleTargetMachine(const Target &T, StringRef TT, | ||||||
|  |                        StringRef CPU, StringRef FS, const TargetOptions &Options, | ||||||
|  |                        Reloc::Model RM, CodeModel::Model CM, | ||||||
|  |                        CodeGenOpt::Level OL) | ||||||
|  |   : ARMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, true) {} | ||||||
|  |  | ||||||
|  | void ARMbeTargetMachine::anchor() { } | ||||||
|  |  | ||||||
|  | ARMbeTargetMachine:: | ||||||
|  | ARMbeTargetMachine(const Target &T, StringRef TT, | ||||||
|  |                        StringRef CPU, StringRef FS, const TargetOptions &Options, | ||||||
|  |                        Reloc::Model RM, CodeModel::Model CM, | ||||||
|  |                        CodeGenOpt::Level OL) | ||||||
|  |   : ARMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, false) {} | ||||||
|  |  | ||||||
| void ThumbTargetMachine::anchor() { } | void ThumbTargetMachine::anchor() { } | ||||||
|  |  | ||||||
| ThumbTargetMachine::ThumbTargetMachine(const Target &T, StringRef TT, | ThumbTargetMachine::ThumbTargetMachine(const Target &T, StringRef TT, | ||||||
|                                        StringRef CPU, StringRef FS, |                                        StringRef CPU, StringRef FS, | ||||||
|                                        const TargetOptions &Options, |                                        const TargetOptions &Options, | ||||||
|                                        Reloc::Model RM, CodeModel::Model CM, |                                        Reloc::Model RM, CodeModel::Model CM, | ||||||
|                                        CodeGenOpt::Level OL) |                                        CodeGenOpt::Level OL, | ||||||
|   : ARMBaseTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL), |                                        bool isLittle) | ||||||
|  |   : ARMBaseTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, isLittle), | ||||||
|     InstrInfo(Subtarget.hasThumb2() |     InstrInfo(Subtarget.hasThumb2() | ||||||
|               ? ((ARMBaseInstrInfo*)new Thumb2InstrInfo(Subtarget)) |               ? ((ARMBaseInstrInfo*)new Thumb2InstrInfo(Subtarget)) | ||||||
|               : ((ARMBaseInstrInfo*)new Thumb1InstrInfo(Subtarget))), |               : ((ARMBaseInstrInfo*)new Thumb1InstrInfo(Subtarget))), | ||||||
| @@ -151,6 +180,24 @@ ThumbTargetMachine::ThumbTargetMachine(const Target &T, StringRef TT, | |||||||
|   initAsmInfo(); |   initAsmInfo(); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void ThumbleTargetMachine::anchor() { } | ||||||
|  |  | ||||||
|  | ThumbleTargetMachine:: | ||||||
|  | ThumbleTargetMachine(const Target &T, StringRef TT, | ||||||
|  |                        StringRef CPU, StringRef FS, const TargetOptions &Options, | ||||||
|  |                        Reloc::Model RM, CodeModel::Model CM, | ||||||
|  |                        CodeGenOpt::Level OL) | ||||||
|  |   : ThumbTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, true) {} | ||||||
|  |  | ||||||
|  | void ThumbbeTargetMachine::anchor() { } | ||||||
|  |  | ||||||
|  | ThumbbeTargetMachine:: | ||||||
|  | ThumbbeTargetMachine(const Target &T, StringRef TT, | ||||||
|  |                        StringRef CPU, StringRef FS, const TargetOptions &Options, | ||||||
|  |                        Reloc::Model RM, CodeModel::Model CM, | ||||||
|  |                        CodeGenOpt::Level OL) | ||||||
|  |   : ThumbTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL, false) {} | ||||||
|  |  | ||||||
| namespace { | namespace { | ||||||
| /// ARM Code Generator Pass Configuration Options. | /// ARM Code Generator Pass Configuration Options. | ||||||
| class ARMPassConfig : public TargetPassConfig { | class ARMPassConfig : public TargetPassConfig { | ||||||
|   | |||||||
| @@ -42,7 +42,8 @@ public: | |||||||
|                        StringRef CPU, StringRef FS, |                        StringRef CPU, StringRef FS, | ||||||
|                        const TargetOptions &Options, |                        const TargetOptions &Options, | ||||||
|                        Reloc::Model RM, CodeModel::Model CM, |                        Reloc::Model RM, CodeModel::Model CM, | ||||||
|                        CodeGenOpt::Level OL); |                        CodeGenOpt::Level OL, | ||||||
|  |                        bool isLittle); | ||||||
|  |  | ||||||
|   ARMJITInfo *getJITInfo() override { return &JITInfo; } |   ARMJITInfo *getJITInfo() override { return &JITInfo; } | ||||||
|   const ARMSubtarget *getSubtargetImpl() const override { return &Subtarget; } |   const ARMSubtarget *getSubtargetImpl() const override { return &Subtarget; } | ||||||
| @@ -77,7 +78,8 @@ class ARMTargetMachine : public ARMBaseTargetMachine { | |||||||
|                    StringRef CPU, StringRef FS, |                    StringRef CPU, StringRef FS, | ||||||
|                    const TargetOptions &Options, |                    const TargetOptions &Options, | ||||||
|                    Reloc::Model RM, CodeModel::Model CM, |                    Reloc::Model RM, CodeModel::Model CM, | ||||||
|                    CodeGenOpt::Level OL); |                    CodeGenOpt::Level OL, | ||||||
|  |                    bool isLittle); | ||||||
|  |  | ||||||
|   const ARMRegisterInfo *getRegisterInfo() const override { |   const ARMRegisterInfo *getRegisterInfo() const override { | ||||||
|     return &InstrInfo.getRegisterInfo(); |     return &InstrInfo.getRegisterInfo(); | ||||||
| @@ -97,6 +99,28 @@ class ARMTargetMachine : public ARMBaseTargetMachine { | |||||||
|   const DataLayout *getDataLayout() const override { return &DL; } |   const DataLayout *getDataLayout() const override { return &DL; } | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | /// ARMleTargetMachine - ARM little endian target machine. | ||||||
|  | /// | ||||||
|  | class ARMleTargetMachine : public ARMTargetMachine { | ||||||
|  |   virtual void anchor(); | ||||||
|  | public: | ||||||
|  |   ARMleTargetMachine(const Target &T, StringRef TT, | ||||||
|  |                      StringRef CPU, StringRef FS, const TargetOptions &Options, | ||||||
|  |                      Reloc::Model RM, CodeModel::Model CM, | ||||||
|  |                      CodeGenOpt::Level OL); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | /// ARMbeTargetMachine - ARM big endian target machine. | ||||||
|  | /// | ||||||
|  | class ARMbeTargetMachine : public ARMTargetMachine { | ||||||
|  |   virtual void anchor(); | ||||||
|  | public: | ||||||
|  |   ARMbeTargetMachine(const Target &T, StringRef TT, | ||||||
|  |                      StringRef CPU, StringRef FS, const TargetOptions &Options, | ||||||
|  |                      Reloc::Model RM, CodeModel::Model CM, | ||||||
|  |                      CodeGenOpt::Level OL); | ||||||
|  | }; | ||||||
|  |  | ||||||
| /// ThumbTargetMachine - Thumb target machine. | /// ThumbTargetMachine - Thumb target machine. | ||||||
| /// Due to the way architectures are handled, this represents both | /// Due to the way architectures are handled, this represents both | ||||||
| ///   Thumb-1 and Thumb-2. | ///   Thumb-1 and Thumb-2. | ||||||
| @@ -115,7 +139,8 @@ public: | |||||||
|                      StringRef CPU, StringRef FS, |                      StringRef CPU, StringRef FS, | ||||||
|                      const TargetOptions &Options, |                      const TargetOptions &Options, | ||||||
|                      Reloc::Model RM, CodeModel::Model CM, |                      Reloc::Model RM, CodeModel::Model CM, | ||||||
|                      CodeGenOpt::Level OL); |                      CodeGenOpt::Level OL, | ||||||
|  |                      bool isLittle); | ||||||
|  |  | ||||||
|   /// returns either Thumb1RegisterInfo or Thumb2RegisterInfo |   /// returns either Thumb1RegisterInfo or Thumb2RegisterInfo | ||||||
|   const ARMBaseRegisterInfo *getRegisterInfo() const override { |   const ARMBaseRegisterInfo *getRegisterInfo() const override { | ||||||
| @@ -141,6 +166,28 @@ public: | |||||||
|   const DataLayout *getDataLayout() const override { return &DL; } |   const DataLayout *getDataLayout() const override { return &DL; } | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | /// ThumbleTargetMachine - Thumb little endian target machine. | ||||||
|  | /// | ||||||
|  | class ThumbleTargetMachine : public ThumbTargetMachine { | ||||||
|  |   virtual void anchor(); | ||||||
|  | public: | ||||||
|  |   ThumbleTargetMachine(const Target &T, StringRef TT, | ||||||
|  |                      StringRef CPU, StringRef FS, const TargetOptions &Options, | ||||||
|  |                      Reloc::Model RM, CodeModel::Model CM, | ||||||
|  |                      CodeGenOpt::Level OL); | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | /// ThumbbeTargetMachine - Thumb big endian target machine. | ||||||
|  | /// | ||||||
|  | class ThumbbeTargetMachine : public ThumbTargetMachine { | ||||||
|  |   virtual void anchor(); | ||||||
|  | public: | ||||||
|  |   ThumbbeTargetMachine(const Target &T, StringRef TT, | ||||||
|  |                        StringRef CPU, StringRef FS, const TargetOptions &Options, | ||||||
|  |                        Reloc::Model RM, CodeModel::Model CM, | ||||||
|  |                        CodeGenOpt::Level OL); | ||||||
|  | }; | ||||||
|  |  | ||||||
| } // end namespace llvm | } // end namespace llvm | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|   | |||||||
| @@ -9251,8 +9251,10 @@ bool ARMAsmParser::parseDirectiveThumbSet(SMLoc L) { | |||||||
|  |  | ||||||
| /// Force static initialization. | /// Force static initialization. | ||||||
| extern "C" void LLVMInitializeARMAsmParser() { | extern "C" void LLVMInitializeARMAsmParser() { | ||||||
|   RegisterMCAsmParser<ARMAsmParser> X(TheARMTarget); |   RegisterMCAsmParser<ARMAsmParser> X(TheARMleTarget); | ||||||
|   RegisterMCAsmParser<ARMAsmParser> Y(TheThumbTarget); |   RegisterMCAsmParser<ARMAsmParser> Y(TheARMbeTarget); | ||||||
|  |   RegisterMCAsmParser<ARMAsmParser> A(TheThumbleTarget); | ||||||
|  |   RegisterMCAsmParser<ARMAsmParser> B(TheThumbbeTarget); | ||||||
| } | } | ||||||
|  |  | ||||||
| #define GET_REGISTER_MATCHER | #define GET_REGISTER_MATCHER | ||||||
|   | |||||||
| @@ -856,9 +856,13 @@ DecodeStatus ThumbDisassembler::getInstruction(MCInst &MI, uint64_t &Size, | |||||||
|  |  | ||||||
|  |  | ||||||
| extern "C" void LLVMInitializeARMDisassembler() { | extern "C" void LLVMInitializeARMDisassembler() { | ||||||
|   TargetRegistry::RegisterMCDisassembler(TheARMTarget, |   TargetRegistry::RegisterMCDisassembler(TheARMleTarget, | ||||||
|                                          createARMDisassembler); |                                          createARMDisassembler); | ||||||
|   TargetRegistry::RegisterMCDisassembler(TheThumbTarget, |   TargetRegistry::RegisterMCDisassembler(TheARMbeTarget, | ||||||
|  |                                          createARMDisassembler); | ||||||
|  |   TargetRegistry::RegisterMCDisassembler(TheThumbleTarget, | ||||||
|  |                                          createThumbDisassembler); | ||||||
|  |   TargetRegistry::RegisterMCDisassembler(TheThumbbeTarget, | ||||||
|                                          createThumbDisassembler); |                                          createThumbDisassembler); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -42,10 +42,11 @@ public: | |||||||
| class ARMAsmBackend : public MCAsmBackend { | class ARMAsmBackend : public MCAsmBackend { | ||||||
|   const MCSubtargetInfo* STI; |   const MCSubtargetInfo* STI; | ||||||
|   bool isThumbMode;     // Currently emitting Thumb code. |   bool isThumbMode;     // Currently emitting Thumb code. | ||||||
|  |   bool IsLittleEndian;  // Big or little endian. | ||||||
| public: | public: | ||||||
|   ARMAsmBackend(const Target &T, const StringRef TT) |   ARMAsmBackend(const Target &T, const StringRef TT, bool IsLittle) | ||||||
|     : MCAsmBackend(), STI(ARM_MC::createARMMCSubtargetInfo(TT, "", "")), |     : MCAsmBackend(), STI(ARM_MC::createARMMCSubtargetInfo(TT, "", "")), | ||||||
|       isThumbMode(TT.startswith("thumb")) {} |       isThumbMode(TT.startswith("thumb")), IsLittleEndian(IsLittle) {} | ||||||
|  |  | ||||||
|   ~ARMAsmBackend() { |   ~ARMAsmBackend() { | ||||||
|     delete STI; |     delete STI; | ||||||
| @@ -60,7 +61,7 @@ public: | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const override { |   const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const override { | ||||||
|     const static MCFixupKindInfo Infos[ARM::NumTargetFixupKinds] = { |     const static MCFixupKindInfo InfosLE[ARM::NumTargetFixupKinds] = { | ||||||
| // This table *must* be in the order that the fixup_* kinds are defined in | // This table *must* be in the order that the fixup_* kinds are defined in | ||||||
| // ARMFixupKinds.h. | // ARMFixupKinds.h. | ||||||
| // | // | ||||||
| @@ -101,13 +102,54 @@ public: | |||||||
| { "fixup_t2_movt_hi16_pcrel", 0,           20,  MCFixupKindInfo::FKF_IsPCRel }, | { "fixup_t2_movt_hi16_pcrel", 0,           20,  MCFixupKindInfo::FKF_IsPCRel }, | ||||||
| { "fixup_t2_movw_lo16_pcrel", 0,           20,  MCFixupKindInfo::FKF_IsPCRel }, | { "fixup_t2_movw_lo16_pcrel", 0,           20,  MCFixupKindInfo::FKF_IsPCRel }, | ||||||
|     }; |     }; | ||||||
|  |     const static MCFixupKindInfo InfosBE[ARM::NumTargetFixupKinds] = { | ||||||
|  | // This table *must* be in the order that the fixup_* kinds are defined in | ||||||
|  | // ARMFixupKinds.h. | ||||||
|  | // | ||||||
|  | // Name                      Offset (bits) Size (bits)     Flags | ||||||
|  | { "fixup_arm_ldst_pcrel_12", 0,            32,  MCFixupKindInfo::FKF_IsPCRel }, | ||||||
|  | { "fixup_t2_ldst_pcrel_12",  0,            32,  MCFixupKindInfo::FKF_IsPCRel | | ||||||
|  |                                    MCFixupKindInfo::FKF_IsAlignedDownTo32Bits}, | ||||||
|  | { "fixup_arm_pcrel_10_unscaled", 0,        32,  MCFixupKindInfo::FKF_IsPCRel }, | ||||||
|  | { "fixup_arm_pcrel_10",      0,            32,  MCFixupKindInfo::FKF_IsPCRel }, | ||||||
|  | { "fixup_t2_pcrel_10",       0,            32,  MCFixupKindInfo::FKF_IsPCRel | | ||||||
|  |                                    MCFixupKindInfo::FKF_IsAlignedDownTo32Bits}, | ||||||
|  | { "fixup_thumb_adr_pcrel_10",8,            8,   MCFixupKindInfo::FKF_IsPCRel | | ||||||
|  |                                    MCFixupKindInfo::FKF_IsAlignedDownTo32Bits}, | ||||||
|  | { "fixup_arm_adr_pcrel_12",  0,            32,  MCFixupKindInfo::FKF_IsPCRel }, | ||||||
|  | { "fixup_t2_adr_pcrel_12",   0,            32,  MCFixupKindInfo::FKF_IsPCRel | | ||||||
|  |                                    MCFixupKindInfo::FKF_IsAlignedDownTo32Bits}, | ||||||
|  | { "fixup_arm_condbranch",    8,            24,  MCFixupKindInfo::FKF_IsPCRel }, | ||||||
|  | { "fixup_arm_uncondbranch",  8,            24,  MCFixupKindInfo::FKF_IsPCRel }, | ||||||
|  | { "fixup_t2_condbranch",     0,            32,  MCFixupKindInfo::FKF_IsPCRel }, | ||||||
|  | { "fixup_t2_uncondbranch",   0,            32,  MCFixupKindInfo::FKF_IsPCRel }, | ||||||
|  | { "fixup_arm_thumb_br",      0,            16,  MCFixupKindInfo::FKF_IsPCRel }, | ||||||
|  | { "fixup_arm_uncondbl",      8,            24,  MCFixupKindInfo::FKF_IsPCRel }, | ||||||
|  | { "fixup_arm_condbl",        8,            24,  MCFixupKindInfo::FKF_IsPCRel }, | ||||||
|  | { "fixup_arm_blx",           8,            24,  MCFixupKindInfo::FKF_IsPCRel }, | ||||||
|  | { "fixup_arm_thumb_bl",      0,            32,  MCFixupKindInfo::FKF_IsPCRel }, | ||||||
|  | { "fixup_arm_thumb_blx",     0,            32,  MCFixupKindInfo::FKF_IsPCRel }, | ||||||
|  | { "fixup_arm_thumb_cb",      0,            16,  MCFixupKindInfo::FKF_IsPCRel }, | ||||||
|  | { "fixup_arm_thumb_cp",      8,             8,  MCFixupKindInfo::FKF_IsPCRel | | ||||||
|  |                                    MCFixupKindInfo::FKF_IsAlignedDownTo32Bits}, | ||||||
|  | { "fixup_arm_thumb_bcc",     8,             8,  MCFixupKindInfo::FKF_IsPCRel }, | ||||||
|  | // movw / movt: 16-bits immediate but scattered into two chunks 0 - 12, 16 - 19. | ||||||
|  | { "fixup_arm_movt_hi16",     12,           20,  0 }, | ||||||
|  | { "fixup_arm_movw_lo16",     12,           20,  0 }, | ||||||
|  | { "fixup_t2_movt_hi16",      12,           20,  0 }, | ||||||
|  | { "fixup_t2_movw_lo16",      12,           20,  0 }, | ||||||
|  | { "fixup_arm_movt_hi16_pcrel", 12,         20,  MCFixupKindInfo::FKF_IsPCRel }, | ||||||
|  | { "fixup_arm_movw_lo16_pcrel", 12,         20,  MCFixupKindInfo::FKF_IsPCRel }, | ||||||
|  | { "fixup_t2_movt_hi16_pcrel", 12,          20,  MCFixupKindInfo::FKF_IsPCRel }, | ||||||
|  | { "fixup_t2_movw_lo16_pcrel", 12,          20,  MCFixupKindInfo::FKF_IsPCRel }, | ||||||
|  |     }; | ||||||
|  |  | ||||||
|     if (Kind < FirstTargetFixupKind) |     if (Kind < FirstTargetFixupKind) | ||||||
|       return MCAsmBackend::getFixupKindInfo(Kind); |       return MCAsmBackend::getFixupKindInfo(Kind); | ||||||
|  |  | ||||||
|     assert(unsigned(Kind - FirstTargetFixupKind) < getNumFixupKinds() && |     assert(unsigned(Kind - FirstTargetFixupKind) < getNumFixupKinds() && | ||||||
|            "Invalid kind!"); |            "Invalid kind!"); | ||||||
|     return Infos[Kind - FirstTargetFixupKind]; |     return (IsLittleEndian ? InfosLE : InfosBE)[Kind - FirstTargetFixupKind]; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /// processFixupValue - Target hook to process the literal value of a fixup |   /// processFixupValue - Target hook to process the literal value of a fixup | ||||||
| @@ -146,6 +188,7 @@ public: | |||||||
|   unsigned getPointerSize() const { return 4; } |   unsigned getPointerSize() const { return 4; } | ||||||
|   bool isThumb() const { return isThumbMode; } |   bool isThumb() const { return isThumbMode; } | ||||||
|   void setIsThumb(bool it) { isThumbMode = it; } |   void setIsThumb(bool it) { isThumbMode = it; } | ||||||
|  |   bool isLittle() const { return IsLittleEndian; } | ||||||
| }; | }; | ||||||
| } // end anonymous namespace | } // end anonymous namespace | ||||||
|  |  | ||||||
| @@ -637,6 +680,57 @@ static unsigned getFixupKindNumBytes(unsigned Kind) { | |||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /// getFixupKindContainerSizeBytes - The number of bytes of the | ||||||
|  | /// container involved in big endian. | ||||||
|  | static unsigned getFixupKindContainerSizeBytes(unsigned Kind) { | ||||||
|  |   switch (Kind) { | ||||||
|  |   default: | ||||||
|  |     llvm_unreachable("Unknown fixup kind!"); | ||||||
|  |  | ||||||
|  |   case FK_Data_1: | ||||||
|  |     return 1; | ||||||
|  |   case FK_Data_2: | ||||||
|  |     return 2; | ||||||
|  |   case FK_Data_4: | ||||||
|  |     return 4; | ||||||
|  |  | ||||||
|  |   case ARM::fixup_arm_thumb_bcc: | ||||||
|  |   case ARM::fixup_arm_thumb_cp: | ||||||
|  |   case ARM::fixup_thumb_adr_pcrel_10: | ||||||
|  |   case ARM::fixup_arm_thumb_br: | ||||||
|  |   case ARM::fixup_arm_thumb_cb: | ||||||
|  |     // Instruction size is 2 bytes. | ||||||
|  |     return 2; | ||||||
|  |  | ||||||
|  |   case ARM::fixup_arm_pcrel_10_unscaled: | ||||||
|  |   case ARM::fixup_arm_ldst_pcrel_12: | ||||||
|  |   case ARM::fixup_arm_pcrel_10: | ||||||
|  |   case ARM::fixup_arm_adr_pcrel_12: | ||||||
|  |   case ARM::fixup_arm_uncondbl: | ||||||
|  |   case ARM::fixup_arm_condbl: | ||||||
|  |   case ARM::fixup_arm_blx: | ||||||
|  |   case ARM::fixup_arm_condbranch: | ||||||
|  |   case ARM::fixup_arm_uncondbranch: | ||||||
|  |   case ARM::fixup_t2_ldst_pcrel_12: | ||||||
|  |   case ARM::fixup_t2_condbranch: | ||||||
|  |   case ARM::fixup_t2_uncondbranch: | ||||||
|  |   case ARM::fixup_t2_pcrel_10: | ||||||
|  |   case ARM::fixup_t2_adr_pcrel_12: | ||||||
|  |   case ARM::fixup_arm_thumb_bl: | ||||||
|  |   case ARM::fixup_arm_thumb_blx: | ||||||
|  |   case ARM::fixup_arm_movt_hi16: | ||||||
|  |   case ARM::fixup_arm_movw_lo16: | ||||||
|  |   case ARM::fixup_arm_movt_hi16_pcrel: | ||||||
|  |   case ARM::fixup_arm_movw_lo16_pcrel: | ||||||
|  |   case ARM::fixup_t2_movt_hi16: | ||||||
|  |   case ARM::fixup_t2_movw_lo16: | ||||||
|  |   case ARM::fixup_t2_movt_hi16_pcrel: | ||||||
|  |   case ARM::fixup_t2_movw_lo16_pcrel: | ||||||
|  |     // Instruction size is 4 bytes. | ||||||
|  |     return 4; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
| void ARMAsmBackend::applyFixup(const MCFixup &Fixup, char *Data, | void ARMAsmBackend::applyFixup(const MCFixup &Fixup, char *Data, | ||||||
|                                unsigned DataSize, uint64_t Value) const { |                                unsigned DataSize, uint64_t Value) const { | ||||||
|   unsigned NumBytes = getFixupKindNumBytes(Fixup.getKind()); |   unsigned NumBytes = getFixupKindNumBytes(Fixup.getKind()); | ||||||
| @@ -646,11 +740,18 @@ void ARMAsmBackend::applyFixup(const MCFixup &Fixup, char *Data, | |||||||
|   unsigned Offset = Fixup.getOffset(); |   unsigned Offset = Fixup.getOffset(); | ||||||
|   assert(Offset + NumBytes <= DataSize && "Invalid fixup offset!"); |   assert(Offset + NumBytes <= DataSize && "Invalid fixup offset!"); | ||||||
|  |  | ||||||
|  |   // Used to point to big endian bytes. | ||||||
|  |   unsigned FullSizeBytes; | ||||||
|  |   if (!IsLittleEndian) | ||||||
|  |     FullSizeBytes = getFixupKindContainerSizeBytes(Fixup.getKind()); | ||||||
|  |  | ||||||
|   // For each byte of the fragment that the fixup touches, mask in the bits from |   // For each byte of the fragment that the fixup touches, mask in the bits from | ||||||
|   // the fixup value. The Value has been "split up" into the appropriate |   // the fixup value. The Value has been "split up" into the appropriate | ||||||
|   // bitfields above. |   // bitfields above. | ||||||
|   for (unsigned i = 0; i != NumBytes; ++i) |   for (unsigned i = 0; i != NumBytes; ++i) { | ||||||
|     Data[Offset + i] |= uint8_t((Value >> (i * 8)) & 0xff); |     unsigned Idx = IsLittleEndian ? i : (FullSizeBytes - 1 - i); | ||||||
|  |     Data[Offset + Idx] |= uint8_t((Value >> (i * 8)) & 0xff); | ||||||
|  |   } | ||||||
| } | } | ||||||
|  |  | ||||||
| namespace { | namespace { | ||||||
| @@ -661,11 +762,11 @@ class ELFARMAsmBackend : public ARMAsmBackend { | |||||||
| public: | public: | ||||||
|   uint8_t OSABI; |   uint8_t OSABI; | ||||||
|   ELFARMAsmBackend(const Target &T, const StringRef TT, |   ELFARMAsmBackend(const Target &T, const StringRef TT, | ||||||
|                    uint8_t _OSABI) |                    uint8_t _OSABI, bool _IsLittle) | ||||||
|     : ARMAsmBackend(T, TT), OSABI(_OSABI) { } |     : ARMAsmBackend(T, TT, _IsLittle), OSABI(_OSABI) { } | ||||||
|  |  | ||||||
|   MCObjectWriter *createObjectWriter(raw_ostream &OS) const override { |   MCObjectWriter *createObjectWriter(raw_ostream &OS) const override { | ||||||
|     return createARMELFObjectWriter(OS, OSABI); |     return createARMELFObjectWriter(OS, OSABI, isLittle()); | ||||||
|   } |   } | ||||||
| }; | }; | ||||||
|  |  | ||||||
| @@ -675,7 +776,7 @@ public: | |||||||
|   const MachO::CPUSubTypeARM Subtype; |   const MachO::CPUSubTypeARM Subtype; | ||||||
|   DarwinARMAsmBackend(const Target &T, const StringRef TT, |   DarwinARMAsmBackend(const Target &T, const StringRef TT, | ||||||
|                       MachO::CPUSubTypeARM st) |                       MachO::CPUSubTypeARM st) | ||||||
|     : ARMAsmBackend(T, TT), Subtype(st) { |     : ARMAsmBackend(T, TT, /* IsLittleEndian */ true), Subtype(st) { | ||||||
|       HasDataInCodeSupport = true; |       HasDataInCodeSupport = true; | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -690,7 +791,8 @@ public: | |||||||
|  |  | ||||||
| MCAsmBackend *llvm::createARMAsmBackend(const Target &T, | MCAsmBackend *llvm::createARMAsmBackend(const Target &T, | ||||||
|                                         const MCRegisterInfo &MRI, |                                         const MCRegisterInfo &MRI, | ||||||
|                                         StringRef TT, StringRef CPU) { |                                         StringRef TT, StringRef CPU, | ||||||
|  |                                         bool isLittle) { | ||||||
|   Triple TheTriple(TT); |   Triple TheTriple(TT); | ||||||
|  |  | ||||||
|   if (TheTriple.isOSBinFormatMachO()) { |   if (TheTriple.isOSBinFormatMachO()) { | ||||||
| @@ -716,5 +818,30 @@ MCAsmBackend *llvm::createARMAsmBackend(const Target &T, | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
|   uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(Triple(TT).getOS()); |   uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(Triple(TT).getOS()); | ||||||
|   return new ELFARMAsmBackend(T, TT, OSABI); |   return new ELFARMAsmBackend(T, TT, OSABI, isLittle); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | MCAsmBackend *llvm::createARMleAsmBackend(const Target &T, | ||||||
|  |                                           const MCRegisterInfo &MRI, | ||||||
|  |                                           StringRef TT, StringRef CPU) { | ||||||
|  |   return createARMAsmBackend(T, MRI, TT, CPU, true); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | MCAsmBackend *llvm::createARMbeAsmBackend(const Target &T, | ||||||
|  |                                           const MCRegisterInfo &MRI, | ||||||
|  |                                           StringRef TT, StringRef CPU) { | ||||||
|  |   return createARMAsmBackend(T, MRI, TT, CPU, false); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | MCAsmBackend *llvm::createThumbleAsmBackend(const Target &T, | ||||||
|  |                                           const MCRegisterInfo &MRI, | ||||||
|  |                                           StringRef TT, StringRef CPU) { | ||||||
|  |   return createARMAsmBackend(T, MRI, TT, CPU, true); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | MCAsmBackend *llvm::createThumbbeAsmBackend(const Target &T, | ||||||
|  |                                           const MCRegisterInfo &MRI, | ||||||
|  |                                           StringRef TT, StringRef CPU) { | ||||||
|  |   return createARMAsmBackend(T, MRI, TT, CPU, false); | ||||||
|  | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -299,7 +299,8 @@ unsigned ARMELFObjectWriter::GetRelocTypeInner(const MCValue &Target, | |||||||
| } | } | ||||||
|  |  | ||||||
| MCObjectWriter *llvm::createARMELFObjectWriter(raw_ostream &OS, | MCObjectWriter *llvm::createARMELFObjectWriter(raw_ostream &OS, | ||||||
|                                                uint8_t OSABI) { |                                                uint8_t OSABI, | ||||||
|  |                                                bool IsLittleEndian) { | ||||||
|   MCELFObjectTargetWriter *MOTW = new ARMELFObjectWriter(OSABI); |   MCELFObjectTargetWriter *MOTW = new ARMELFObjectWriter(OSABI); | ||||||
|   return createELFObjectWriter(MOTW, OS,  /*IsLittleEndian=*/true); |   return createELFObjectWriter(MOTW, OS, IsLittleEndian); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -13,12 +13,18 @@ | |||||||
|  |  | ||||||
| #include "ARMMCAsmInfo.h" | #include "ARMMCAsmInfo.h" | ||||||
| #include "llvm/Support/CommandLine.h" | #include "llvm/Support/CommandLine.h" | ||||||
|  | #include "llvm/ADT/Triple.h" | ||||||
|  |  | ||||||
| using namespace llvm; | using namespace llvm; | ||||||
|  |  | ||||||
| void ARMMCAsmInfoDarwin::anchor() { } | void ARMMCAsmInfoDarwin::anchor() { } | ||||||
|  |  | ||||||
| ARMMCAsmInfoDarwin::ARMMCAsmInfoDarwin() { | ARMMCAsmInfoDarwin::ARMMCAsmInfoDarwin(StringRef TT) { | ||||||
|  |   Triple TheTriple(TT); | ||||||
|  |   if ((TheTriple.getArch() == Triple::armeb) || | ||||||
|  |       (TheTriple.getArch() == Triple::thumbeb)) | ||||||
|  |     IsLittleEndian = false; | ||||||
|  |  | ||||||
|   Data64bitsDirective = 0; |   Data64bitsDirective = 0; | ||||||
|   CommentString = "@"; |   CommentString = "@"; | ||||||
|   Code16Directive = ".code\t16"; |   Code16Directive = ".code\t16"; | ||||||
| @@ -35,7 +41,12 @@ ARMMCAsmInfoDarwin::ARMMCAsmInfoDarwin() { | |||||||
|  |  | ||||||
| void ARMELFMCAsmInfo::anchor() { } | void ARMELFMCAsmInfo::anchor() { } | ||||||
|  |  | ||||||
| ARMELFMCAsmInfo::ARMELFMCAsmInfo() { | ARMELFMCAsmInfo::ARMELFMCAsmInfo(StringRef TT) { | ||||||
|  |   Triple TheTriple(TT); | ||||||
|  |   if ((TheTriple.getArch() == Triple::armeb) || | ||||||
|  |       (TheTriple.getArch() == Triple::thumbeb)) | ||||||
|  |     IsLittleEndian = false; | ||||||
|  |  | ||||||
|   // ".comm align is in bytes but .align is pow-2." |   // ".comm align is in bytes but .align is pow-2." | ||||||
|   AlignmentIsInBytes = false; |   AlignmentIsInBytes = false; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -22,13 +22,13 @@ namespace llvm { | |||||||
|   class ARMMCAsmInfoDarwin : public MCAsmInfoDarwin { |   class ARMMCAsmInfoDarwin : public MCAsmInfoDarwin { | ||||||
|     void anchor() override; |     void anchor() override; | ||||||
|   public: |   public: | ||||||
|     explicit ARMMCAsmInfoDarwin(); |     explicit ARMMCAsmInfoDarwin(StringRef TT); | ||||||
|   }; |   }; | ||||||
|  |  | ||||||
|   class ARMELFMCAsmInfo : public MCAsmInfoELF { |   class ARMELFMCAsmInfo : public MCAsmInfoELF { | ||||||
|     void anchor() override; |     void anchor() override; | ||||||
|   public: |   public: | ||||||
|     explicit ARMELFMCAsmInfo(); |     explicit ARMELFMCAsmInfo(StringRef TT); | ||||||
|  |  | ||||||
|     void setUseIntegratedAssembler(bool Value) override; |     void setUseIntegratedAssembler(bool Value) override; | ||||||
|   }; |   }; | ||||||
|   | |||||||
| @@ -40,10 +40,11 @@ class ARMMCCodeEmitter : public MCCodeEmitter { | |||||||
|   void operator=(const ARMMCCodeEmitter &) LLVM_DELETED_FUNCTION; |   void operator=(const ARMMCCodeEmitter &) LLVM_DELETED_FUNCTION; | ||||||
|   const MCInstrInfo &MCII; |   const MCInstrInfo &MCII; | ||||||
|   const MCContext &CTX; |   const MCContext &CTX; | ||||||
|  |   bool IsLittleEndian; | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   ARMMCCodeEmitter(const MCInstrInfo &mcii, MCContext &ctx) |   ARMMCCodeEmitter(const MCInstrInfo &mcii, MCContext &ctx, bool IsLittle) | ||||||
|     : MCII(mcii), CTX(ctx) { |     : MCII(mcii), CTX(ctx), IsLittleEndian(IsLittle) { | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   ~ARMMCCodeEmitter() {} |   ~ARMMCCodeEmitter() {} | ||||||
| @@ -385,8 +386,8 @@ public: | |||||||
|   void EmitConstant(uint64_t Val, unsigned Size, raw_ostream &OS) const { |   void EmitConstant(uint64_t Val, unsigned Size, raw_ostream &OS) const { | ||||||
|     // Output the constant in little endian byte order. |     // Output the constant in little endian byte order. | ||||||
|     for (unsigned i = 0; i != Size; ++i) { |     for (unsigned i = 0; i != Size; ++i) { | ||||||
|       EmitByte(Val & 255, OS); |       unsigned Shift = IsLittleEndian ? i * 8 : (Size - 1 - i) * 8; | ||||||
|       Val >>= 8; |       EmitByte((Val >> Shift) & 0xff, OS); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -397,11 +398,18 @@ public: | |||||||
|  |  | ||||||
| } // end anonymous namespace | } // end anonymous namespace | ||||||
|  |  | ||||||
| MCCodeEmitter *llvm::createARMMCCodeEmitter(const MCInstrInfo &MCII, | MCCodeEmitter *llvm::createARMleMCCodeEmitter(const MCInstrInfo &MCII, | ||||||
|                                               const MCRegisterInfo &MRI, |                                               const MCRegisterInfo &MRI, | ||||||
|                                               const MCSubtargetInfo &STI, |                                               const MCSubtargetInfo &STI, | ||||||
|                                               MCContext &Ctx) { |                                               MCContext &Ctx) { | ||||||
|   return new ARMMCCodeEmitter(MCII, Ctx); |   return new ARMMCCodeEmitter(MCII, Ctx, true); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | MCCodeEmitter *llvm::createARMbeMCCodeEmitter(const MCInstrInfo &MCII, | ||||||
|  |                                               const MCRegisterInfo &MRI, | ||||||
|  |                                               const MCSubtargetInfo &STI, | ||||||
|  |                                               MCContext &Ctx) { | ||||||
|  |   return new ARMMCCodeEmitter(MCII, Ctx, false); | ||||||
| } | } | ||||||
|  |  | ||||||
| /// NEONThumb2DataIPostEncoder - Post-process encoded NEON data-processing | /// NEONThumb2DataIPostEncoder - Post-process encoded NEON data-processing | ||||||
|   | |||||||
| @@ -89,11 +89,16 @@ std::string ARM_MC::ParseARMTriple(StringRef TT, StringRef CPU) { | |||||||
|   unsigned Idx = 0; |   unsigned Idx = 0; | ||||||
|  |  | ||||||
|   // FIXME: Enhance Triple helper class to extract ARM version. |   // FIXME: Enhance Triple helper class to extract ARM version. | ||||||
|   bool isThumb = triple.getArch() == Triple::thumb; |   bool isThumb = triple.getArch() == Triple::thumb || | ||||||
|  |                  triple.getArch() == Triple::thumbeb; | ||||||
|   if (Len >= 5 && TT.substr(0, 4) == "armv") |   if (Len >= 5 && TT.substr(0, 4) == "armv") | ||||||
|     Idx = 4; |     Idx = 4; | ||||||
|  |   else if (Len >= 7 && TT.substr(0, 6) == "armebv") | ||||||
|  |     Idx = 6; | ||||||
|   else if (Len >= 7 && TT.substr(0, 6) == "thumbv") |   else if (Len >= 7 && TT.substr(0, 6) == "thumbv") | ||||||
|     Idx = 6; |     Idx = 6; | ||||||
|  |   else if (Len >= 9 && TT.substr(0, 8) == "thumbebv") | ||||||
|  |     Idx = 8; | ||||||
|  |  | ||||||
|   bool NoCPU = CPU == "generic" || CPU.empty(); |   bool NoCPU = CPU == "generic" || CPU.empty(); | ||||||
|   std::string ARMArchFeature; |   std::string ARMArchFeature; | ||||||
| @@ -214,9 +219,9 @@ static MCAsmInfo *createARMMCAsmInfo(const MCRegisterInfo &MRI, StringRef TT) { | |||||||
|  |  | ||||||
|   MCAsmInfo *MAI; |   MCAsmInfo *MAI; | ||||||
|   if (TheTriple.isOSBinFormatMachO()) |   if (TheTriple.isOSBinFormatMachO()) | ||||||
|     MAI = new ARMMCAsmInfoDarwin(); |     MAI = new ARMMCAsmInfoDarwin(TT); | ||||||
|   else |   else | ||||||
|     MAI = new ARMELFMCAsmInfo(); |     MAI = new ARMELFMCAsmInfo(TT); | ||||||
|  |  | ||||||
|   unsigned Reg = MRI.getDwarfRegNum(ARM::SP, true); |   unsigned Reg = MRI.getDwarfRegNum(ARM::SP, true); | ||||||
|   MAI->addInitialFrameState(MCCFIInstruction::createDefCfa(0, Reg, 0)); |   MAI->addInitialFrameState(MCCFIInstruction::createDefCfa(0, Reg, 0)); | ||||||
| @@ -323,56 +328,94 @@ static MCInstrAnalysis *createARMMCInstrAnalysis(const MCInstrInfo *Info) { | |||||||
| // Force static initialization. | // Force static initialization. | ||||||
| extern "C" void LLVMInitializeARMTargetMC() { | extern "C" void LLVMInitializeARMTargetMC() { | ||||||
|   // Register the MC asm info. |   // Register the MC asm info. | ||||||
|   RegisterMCAsmInfoFn A(TheARMTarget, createARMMCAsmInfo); |   RegisterMCAsmInfoFn X(TheARMleTarget, createARMMCAsmInfo); | ||||||
|   RegisterMCAsmInfoFn B(TheThumbTarget, createARMMCAsmInfo); |   RegisterMCAsmInfoFn Y(TheARMbeTarget, createARMMCAsmInfo); | ||||||
|  |   RegisterMCAsmInfoFn A(TheThumbleTarget, createARMMCAsmInfo); | ||||||
|  |   RegisterMCAsmInfoFn B(TheThumbbeTarget, createARMMCAsmInfo); | ||||||
|  |  | ||||||
|   // Register the MC codegen info. |   // Register the MC codegen info. | ||||||
|   TargetRegistry::RegisterMCCodeGenInfo(TheARMTarget, createARMMCCodeGenInfo); |   TargetRegistry::RegisterMCCodeGenInfo(TheARMleTarget, createARMMCCodeGenInfo); | ||||||
|   TargetRegistry::RegisterMCCodeGenInfo(TheThumbTarget, createARMMCCodeGenInfo); |   TargetRegistry::RegisterMCCodeGenInfo(TheARMbeTarget, createARMMCCodeGenInfo); | ||||||
|  |   TargetRegistry::RegisterMCCodeGenInfo(TheThumbleTarget, createARMMCCodeGenInfo); | ||||||
|  |   TargetRegistry::RegisterMCCodeGenInfo(TheThumbbeTarget, createARMMCCodeGenInfo); | ||||||
|  |  | ||||||
|   // Register the MC instruction info. |   // Register the MC instruction info. | ||||||
|   TargetRegistry::RegisterMCInstrInfo(TheARMTarget, createARMMCInstrInfo); |   TargetRegistry::RegisterMCInstrInfo(TheARMleTarget, createARMMCInstrInfo); | ||||||
|   TargetRegistry::RegisterMCInstrInfo(TheThumbTarget, createARMMCInstrInfo); |   TargetRegistry::RegisterMCInstrInfo(TheARMbeTarget, createARMMCInstrInfo); | ||||||
|  |   TargetRegistry::RegisterMCInstrInfo(TheThumbleTarget, createARMMCInstrInfo); | ||||||
|  |   TargetRegistry::RegisterMCInstrInfo(TheThumbbeTarget, createARMMCInstrInfo); | ||||||
|  |  | ||||||
|   // Register the MC register info. |   // Register the MC register info. | ||||||
|   TargetRegistry::RegisterMCRegInfo(TheARMTarget, createARMMCRegisterInfo); |   TargetRegistry::RegisterMCRegInfo(TheARMleTarget, createARMMCRegisterInfo); | ||||||
|   TargetRegistry::RegisterMCRegInfo(TheThumbTarget, createARMMCRegisterInfo); |   TargetRegistry::RegisterMCRegInfo(TheARMbeTarget, createARMMCRegisterInfo); | ||||||
|  |   TargetRegistry::RegisterMCRegInfo(TheThumbleTarget, createARMMCRegisterInfo); | ||||||
|  |   TargetRegistry::RegisterMCRegInfo(TheThumbbeTarget, createARMMCRegisterInfo); | ||||||
|  |  | ||||||
|   // Register the MC subtarget info. |   // Register the MC subtarget info. | ||||||
|   TargetRegistry::RegisterMCSubtargetInfo(TheARMTarget, |   TargetRegistry::RegisterMCSubtargetInfo(TheARMleTarget, | ||||||
|                                           ARM_MC::createARMMCSubtargetInfo); |                                           ARM_MC::createARMMCSubtargetInfo); | ||||||
|   TargetRegistry::RegisterMCSubtargetInfo(TheThumbTarget, |   TargetRegistry::RegisterMCSubtargetInfo(TheARMbeTarget, | ||||||
|  |                                           ARM_MC::createARMMCSubtargetInfo); | ||||||
|  |   TargetRegistry::RegisterMCSubtargetInfo(TheThumbleTarget, | ||||||
|  |                                           ARM_MC::createARMMCSubtargetInfo); | ||||||
|  |   TargetRegistry::RegisterMCSubtargetInfo(TheThumbbeTarget, | ||||||
|                                           ARM_MC::createARMMCSubtargetInfo); |                                           ARM_MC::createARMMCSubtargetInfo); | ||||||
|  |  | ||||||
|   // Register the MC instruction analyzer. |   // Register the MC instruction analyzer. | ||||||
|   TargetRegistry::RegisterMCInstrAnalysis(TheARMTarget, |   TargetRegistry::RegisterMCInstrAnalysis(TheARMleTarget, | ||||||
|                                           createARMMCInstrAnalysis); |                                           createARMMCInstrAnalysis); | ||||||
|   TargetRegistry::RegisterMCInstrAnalysis(TheThumbTarget, |   TargetRegistry::RegisterMCInstrAnalysis(TheARMbeTarget, | ||||||
|  |                                           createARMMCInstrAnalysis); | ||||||
|  |   TargetRegistry::RegisterMCInstrAnalysis(TheThumbleTarget, | ||||||
|  |                                           createARMMCInstrAnalysis); | ||||||
|  |   TargetRegistry::RegisterMCInstrAnalysis(TheThumbbeTarget, | ||||||
|                                           createARMMCInstrAnalysis); |                                           createARMMCInstrAnalysis); | ||||||
|  |  | ||||||
|   // Register the MC Code Emitter |   // Register the MC Code Emitter | ||||||
|   TargetRegistry::RegisterMCCodeEmitter(TheARMTarget, createARMMCCodeEmitter); |   TargetRegistry::RegisterMCCodeEmitter(TheARMleTarget, | ||||||
|   TargetRegistry::RegisterMCCodeEmitter(TheThumbTarget, createARMMCCodeEmitter); |                                         createARMleMCCodeEmitter); | ||||||
|  |   TargetRegistry::RegisterMCCodeEmitter(TheARMbeTarget, | ||||||
|  |                                         createARMbeMCCodeEmitter); | ||||||
|  |   TargetRegistry::RegisterMCCodeEmitter(TheThumbleTarget, | ||||||
|  |                                         createARMleMCCodeEmitter); | ||||||
|  |   TargetRegistry::RegisterMCCodeEmitter(TheThumbbeTarget, | ||||||
|  |                                         createARMbeMCCodeEmitter); | ||||||
|  |  | ||||||
|   // Register the asm backend. |   // Register the asm backend. | ||||||
|   TargetRegistry::RegisterMCAsmBackend(TheARMTarget, createARMAsmBackend); |   TargetRegistry::RegisterMCAsmBackend(TheARMleTarget, createARMleAsmBackend); | ||||||
|   TargetRegistry::RegisterMCAsmBackend(TheThumbTarget, createARMAsmBackend); |   TargetRegistry::RegisterMCAsmBackend(TheARMbeTarget, createARMbeAsmBackend); | ||||||
|  |   TargetRegistry::RegisterMCAsmBackend(TheThumbleTarget, | ||||||
|  |                                        createThumbleAsmBackend); | ||||||
|  |   TargetRegistry::RegisterMCAsmBackend(TheThumbbeTarget, | ||||||
|  |                                        createThumbbeAsmBackend); | ||||||
|  |  | ||||||
|   // Register the object streamer. |   // Register the object streamer. | ||||||
|   TargetRegistry::RegisterMCObjectStreamer(TheARMTarget, createMCStreamer); |   TargetRegistry::RegisterMCObjectStreamer(TheARMleTarget, createMCStreamer); | ||||||
|   TargetRegistry::RegisterMCObjectStreamer(TheThumbTarget, createMCStreamer); |   TargetRegistry::RegisterMCObjectStreamer(TheARMbeTarget, createMCStreamer); | ||||||
|  |   TargetRegistry::RegisterMCObjectStreamer(TheThumbleTarget, createMCStreamer); | ||||||
|  |   TargetRegistry::RegisterMCObjectStreamer(TheThumbbeTarget, createMCStreamer); | ||||||
|  |  | ||||||
|   // Register the asm streamer. |   // Register the asm streamer. | ||||||
|   TargetRegistry::RegisterAsmStreamer(TheARMTarget, createMCAsmStreamer); |   TargetRegistry::RegisterAsmStreamer(TheARMleTarget, createMCAsmStreamer); | ||||||
|   TargetRegistry::RegisterAsmStreamer(TheThumbTarget, createMCAsmStreamer); |   TargetRegistry::RegisterAsmStreamer(TheARMbeTarget, createMCAsmStreamer); | ||||||
|  |   TargetRegistry::RegisterAsmStreamer(TheThumbleTarget, createMCAsmStreamer); | ||||||
|  |   TargetRegistry::RegisterAsmStreamer(TheThumbbeTarget, createMCAsmStreamer); | ||||||
|  |  | ||||||
|   // Register the MCInstPrinter. |   // Register the MCInstPrinter. | ||||||
|   TargetRegistry::RegisterMCInstPrinter(TheARMTarget, createARMMCInstPrinter); |   TargetRegistry::RegisterMCInstPrinter(TheARMleTarget, createARMMCInstPrinter); | ||||||
|   TargetRegistry::RegisterMCInstPrinter(TheThumbTarget, createARMMCInstPrinter); |   TargetRegistry::RegisterMCInstPrinter(TheARMbeTarget, createARMMCInstPrinter); | ||||||
|  |   TargetRegistry::RegisterMCInstPrinter(TheThumbleTarget, | ||||||
|  |                                         createARMMCInstPrinter); | ||||||
|  |   TargetRegistry::RegisterMCInstPrinter(TheThumbbeTarget, | ||||||
|  |                                         createARMMCInstPrinter); | ||||||
|  |  | ||||||
|   // Register the MC relocation info. |   // Register the MC relocation info. | ||||||
|   TargetRegistry::RegisterMCRelocationInfo(TheARMTarget, |   TargetRegistry::RegisterMCRelocationInfo(TheARMleTarget, | ||||||
|                                            createARMMCRelocationInfo); |                                            createARMMCRelocationInfo); | ||||||
|   TargetRegistry::RegisterMCRelocationInfo(TheThumbTarget, |   TargetRegistry::RegisterMCRelocationInfo(TheARMbeTarget, | ||||||
|  |                                            createARMMCRelocationInfo); | ||||||
|  |   TargetRegistry::RegisterMCRelocationInfo(TheThumbleTarget, | ||||||
|  |                                            createARMMCRelocationInfo); | ||||||
|  |   TargetRegistry::RegisterMCRelocationInfo(TheThumbbeTarget, | ||||||
|                                            createARMMCRelocationInfo); |                                            createARMMCRelocationInfo); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -33,7 +33,8 @@ class StringRef; | |||||||
| class Target; | class Target; | ||||||
| class raw_ostream; | class raw_ostream; | ||||||
|  |  | ||||||
| extern Target TheARMTarget, TheThumbTarget; | extern Target TheARMleTarget, TheThumbleTarget; | ||||||
|  | extern Target TheARMbeTarget, TheThumbbeTarget; | ||||||
|  |  | ||||||
| namespace ARM_MC { | namespace ARM_MC { | ||||||
|   std::string ParseARMTriple(StringRef TT, StringRef CPU); |   std::string ParseARMTriple(StringRef TT, StringRef CPU); | ||||||
| @@ -51,17 +52,36 @@ MCStreamer *createMCAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS, | |||||||
|                                 MCInstPrinter *InstPrint, MCCodeEmitter *CE, |                                 MCInstPrinter *InstPrint, MCCodeEmitter *CE, | ||||||
|                                 MCAsmBackend *TAB, bool ShowInst); |                                 MCAsmBackend *TAB, bool ShowInst); | ||||||
|  |  | ||||||
| MCCodeEmitter *createARMMCCodeEmitter(const MCInstrInfo &MCII, | MCCodeEmitter *createARMleMCCodeEmitter(const MCInstrInfo &MCII, | ||||||
|  |                                         const MCRegisterInfo &MRI, | ||||||
|  |                                         const MCSubtargetInfo &STI, | ||||||
|  |                                         MCContext &Ctx); | ||||||
|  |  | ||||||
|  | MCCodeEmitter *createARMbeMCCodeEmitter(const MCInstrInfo &MCII, | ||||||
|                                         const MCRegisterInfo &MRI, |                                         const MCRegisterInfo &MRI, | ||||||
|                                         const MCSubtargetInfo &STI, |                                         const MCSubtargetInfo &STI, | ||||||
|                                         MCContext &Ctx); |                                         MCContext &Ctx); | ||||||
|  |  | ||||||
| MCAsmBackend *createARMAsmBackend(const Target &T, const MCRegisterInfo &MRI, | MCAsmBackend *createARMAsmBackend(const Target &T, const MCRegisterInfo &MRI, | ||||||
|  |                                   StringRef TT, StringRef CPU, | ||||||
|  |                                   bool IsLittleEndian); | ||||||
|  |  | ||||||
|  | MCAsmBackend *createARMleAsmBackend(const Target &T, const MCRegisterInfo &MRI, | ||||||
|  |                                   StringRef TT, StringRef CPU); | ||||||
|  |  | ||||||
|  | MCAsmBackend *createARMbeAsmBackend(const Target &T, const MCRegisterInfo &MRI, | ||||||
|  |                                   StringRef TT, StringRef CPU); | ||||||
|  |  | ||||||
|  | MCAsmBackend *createThumbleAsmBackend(const Target &T, const MCRegisterInfo &MRI, | ||||||
|  |                                       StringRef TT, StringRef CPU); | ||||||
|  |  | ||||||
|  | MCAsmBackend *createThumbbeAsmBackend(const Target &T, const MCRegisterInfo &MRI, | ||||||
|                                       StringRef TT, StringRef CPU); |                                       StringRef TT, StringRef CPU); | ||||||
|  |  | ||||||
| /// createARMELFObjectWriter - Construct an ELF Mach-O object writer. | /// createARMELFObjectWriter - Construct an ELF Mach-O object writer. | ||||||
| MCObjectWriter *createARMELFObjectWriter(raw_ostream &OS, | MCObjectWriter *createARMELFObjectWriter(raw_ostream &OS, | ||||||
|                                          uint8_t OSABI); |                                          uint8_t OSABI, | ||||||
|  |                                          bool IsLittleEndian); | ||||||
|  |  | ||||||
| /// createARMMachObjectWriter - Construct an ARM Mach-O object writer. | /// createARMMachObjectWriter - Construct an ARM Mach-O object writer. | ||||||
| MCObjectWriter *createARMMachObjectWriter(raw_ostream &OS, | MCObjectWriter *createARMMachObjectWriter(raw_ostream &OS, | ||||||
|   | |||||||
| @@ -12,12 +12,17 @@ | |||||||
| #include "llvm/Support/TargetRegistry.h" | #include "llvm/Support/TargetRegistry.h" | ||||||
| using namespace llvm; | using namespace llvm; | ||||||
|  |  | ||||||
| Target llvm::TheARMTarget, llvm::TheThumbTarget; | Target llvm::TheARMleTarget,   llvm::TheARMbeTarget; | ||||||
|  | Target llvm::TheThumbleTarget, llvm::TheThumbbeTarget; | ||||||
|  |  | ||||||
| extern "C" void LLVMInitializeARMTargetInfo() {  | extern "C" void LLVMInitializeARMTargetInfo() {  | ||||||
|   RegisterTarget<Triple::arm, /*HasJIT=*/true> |   RegisterTarget<Triple::arm, /*HasJIT=*/true> | ||||||
|     X(TheARMTarget, "arm", "ARM"); |     X(TheARMleTarget, "arm", "ARM"); | ||||||
|  |   RegisterTarget<Triple::armeb, /*HasJIT=*/true> | ||||||
|  |     Y(TheARMbeTarget, "armeb", "ARM (big endian)"); | ||||||
|  |  | ||||||
|   RegisterTarget<Triple::thumb, /*HasJIT=*/true> |   RegisterTarget<Triple::thumb, /*HasJIT=*/true> | ||||||
|     Y(TheThumbTarget, "thumb", "Thumb"); |     A(TheThumbleTarget, "thumb", "Thumb"); | ||||||
|  |   RegisterTarget<Triple::thumbeb, /*HasJIT=*/true> | ||||||
|  |     B(TheThumbbeTarget, "thumbeb", "Thumb (big endian)"); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,9 +1,13 @@ | |||||||
| @ RUN: llvm-mc -triple armv7-unknown-unknown %s --show-encoding > %t | @ RUN: llvm-mc -triple armv7-unknown-unknown %s --show-encoding > %t | ||||||
| @ RUN: FileCheck < %t %s | @ RUN: FileCheck < %t %s | ||||||
|  | @ RUN: llvm-mc -triple armebv7-unknown-unknown %s --show-encoding > %t | ||||||
|  | @ RUN: FileCheck --check-prefix=CHECK-BE < %t %s | ||||||
|  |  | ||||||
|     bl _printf |     bl _printf | ||||||
| @ CHECK: bl _printf @ encoding: [A,A,A,0xeb] | @ CHECK: bl _printf @ encoding: [A,A,A,0xeb] | ||||||
| @ CHECK: @ fixup A - offset: 0, value: _printf, kind: fixup_arm_uncondbl | @ CHECK: @ fixup A - offset: 0, value: _printf, kind: fixup_arm_uncondbl | ||||||
|  | @ CHECK-BE: bl _printf @ encoding: [0xeb,A,A,A] | ||||||
|  | @ CHECK-BE: @ fixup A - offset: 0, value: _printf, kind: fixup_arm_uncondbl | ||||||
|  |  | ||||||
|     mov r9, :lower16:(_foo) |     mov r9, :lower16:(_foo) | ||||||
|     movw r9, :lower16:(_foo) |     movw r9, :lower16:(_foo) | ||||||
| @@ -11,12 +15,20 @@ | |||||||
|  |  | ||||||
| @ CHECK: movw	r9, :lower16:_foo       @ encoding: [A,0x90'A',0b0000AAAA,0xe3] | @ CHECK: movw	r9, :lower16:_foo       @ encoding: [A,0x90'A',0b0000AAAA,0xe3] | ||||||
| @ CHECK: @   fixup A - offset: 0, value: _foo, kind: fixup_arm_movw_lo16 | @ CHECK: @   fixup A - offset: 0, value: _foo, kind: fixup_arm_movw_lo16 | ||||||
|  | @ CHECK-BE: movw	r9, :lower16:_foo       @ encoding: [0xe3,0b0000AAAA,0x90'A',A] | ||||||
|  | @ CHECK-BE: @   fixup A - offset: 0, value: _foo, kind: fixup_arm_movw_lo16 | ||||||
| @ CHECK: movw	r9, :lower16:_foo       @ encoding: [A,0x90'A',0b0000AAAA,0xe3] | @ CHECK: movw	r9, :lower16:_foo       @ encoding: [A,0x90'A',0b0000AAAA,0xe3] | ||||||
| @ CHECK: @   fixup A - offset: 0, value: _foo, kind: fixup_arm_movw_lo16 | @ CHECK: @   fixup A - offset: 0, value: _foo, kind: fixup_arm_movw_lo16 | ||||||
|  | @ CHECK-BE: movw	r9, :lower16:_foo       @ encoding: [0xe3,0b0000AAAA,0x90'A',A] | ||||||
|  | @ CHECK-BE: @   fixup A - offset: 0, value: _foo, kind: fixup_arm_movw_lo16 | ||||||
| @ CHECK: movt	r9, :upper16:_foo       @ encoding: [A,0x90'A',0b0100AAAA,0xe3] | @ CHECK: movt	r9, :upper16:_foo       @ encoding: [A,0x90'A',0b0100AAAA,0xe3] | ||||||
| @ CHECK: @   fixup A - offset: 0, value: _foo, kind: fixup_arm_movt_hi16 | @ CHECK: @   fixup A - offset: 0, value: _foo, kind: fixup_arm_movt_hi16 | ||||||
|  | @ CHECK-BE: movt	r9, :upper16:_foo       @ encoding: [0xe3,0b0100AAAA,0x90'A',A] | ||||||
|  | @ CHECK-BE: @   fixup A - offset: 0, value: _foo, kind: fixup_arm_movt_hi16 | ||||||
|  |  | ||||||
|     mov r2, fred |     mov r2, fred | ||||||
|  |  | ||||||
| @ CHECK: movw  r2, fred                 @ encoding: [A,0x20'A',0b0000AAAA,0xe3] | @ CHECK: movw  r2, fred                 @ encoding: [A,0x20'A',0b0000AAAA,0xe3] | ||||||
| @ CHECK: @   fixup A - offset: 0, value: fred, kind: fixup_arm_movw_lo16 | @ CHECK: @   fixup A - offset: 0, value: fred, kind: fixup_arm_movw_lo16 | ||||||
|  | @ CHECK-BE: movw  r2, fred                 @ encoding: [0xe3,0b0000AAAA,0x20'A',A] | ||||||
|  | @ CHECK-BE: @   fixup A - offset: 0, value: fred, kind: fixup_arm_movw_lo16 | ||||||
|   | |||||||
| @@ -1,4 +1,5 @@ | |||||||
| @ RUN: llvm-mc -triple=armv7-apple-darwin -mcpu=cortex-a8 -show-encoding < %s | FileCheck %s | @ RUN: llvm-mc -triple=armv7-apple-darwin -mcpu=cortex-a8 -show-encoding < %s | FileCheck %s | ||||||
|  | @ RUN: llvm-mc -triple=armebv7-unknown-unknown -mcpu=cortex-a8 -show-encoding < %s | FileCheck --check-prefix=CHECK-BE %s | ||||||
|   .syntax unified |   .syntax unified | ||||||
|   .globl _func |   .globl _func | ||||||
|  |  | ||||||
| @@ -135,8 +136,12 @@ Lforward: | |||||||
| @ CHECK: Lback: | @ CHECK: Lback: | ||||||
| @ CHECK: adr	r2, Lback    @ encoding: [A,0x20'A',0x0f'A',0xe2'A'] | @ CHECK: adr	r2, Lback    @ encoding: [A,0x20'A',0x0f'A',0xe2'A'] | ||||||
| @ CHECK:  @   fixup A - offset: 0, value: Lback, kind: fixup_arm_adr_pcrel_12 | @ CHECK:  @   fixup A - offset: 0, value: Lback, kind: fixup_arm_adr_pcrel_12 | ||||||
|  | @ CHECK-BE: adr	r2, Lback    @ encoding: [0xe2'A',0x0f'A',0x20'A',A] | ||||||
|  | @ CHECK-BE:  @   fixup A - offset: 0, value: Lback, kind: fixup_arm_adr_pcrel_12 | ||||||
| @ CHECK: adr	r3, Lforward @ encoding: [A,0x30'A',0x0f'A',0xe2'A'] | @ CHECK: adr	r3, Lforward @ encoding: [A,0x30'A',0x0f'A',0xe2'A'] | ||||||
| @ CHECK:  @   fixup A - offset: 0, value: Lforward, kind: fixup_arm_adr_pcrel_12 | @ CHECK:  @   fixup A - offset: 0, value: Lforward, kind: fixup_arm_adr_pcrel_12 | ||||||
|  | @ CHECK-BE: adr	r3, Lforward @ encoding: [0xe2'A',0x0f'A',0x30'A',A] | ||||||
|  | @ CHECK-BE:  @   fixup A - offset: 0, value: Lforward, kind: fixup_arm_adr_pcrel_12 | ||||||
| @ CHECK: Lforward: | @ CHECK: Lforward: | ||||||
| @ CHECK: adr	r2, #3                  @ encoding: [0x03,0x20,0x8f,0xe2] | @ CHECK: adr	r2, #3                  @ encoding: [0x03,0x20,0x8f,0xe2] | ||||||
| @ CHECK: adr	r2, #-3                 @ encoding: [0x03,0x20,0x4f,0xe2] | @ CHECK: adr	r2, #-3                 @ encoding: [0x03,0x20,0x4f,0xe2] | ||||||
| @@ -310,9 +315,13 @@ Lforward: | |||||||
|         beq _baz |         beq _baz | ||||||
|  |  | ||||||
| @ CHECK: b	_bar                    @ encoding: [A,A,A,0xea] | @ CHECK: b	_bar                    @ encoding: [A,A,A,0xea] | ||||||
|              @   fixup A - offset: 0, value: _bar, kind: fixup_arm_uncondbranch | @ CHECK: @   fixup A - offset: 0, value: _bar, kind: fixup_arm_uncondbranch | ||||||
|  | @ CHECK-BE: b	_bar                    @ encoding: [0xea,A,A,A] | ||||||
|  | @ CHECK-BE: @   fixup A - offset: 0, value: _bar, kind: fixup_arm_uncondbranch | ||||||
| @ CHECK: beq	_baz                    @ encoding: [A,A,A,0x0a] | @ CHECK: beq	_baz                    @ encoding: [A,A,A,0x0a] | ||||||
|              @   fixup A - offset: 0, value: _baz, kind: fixup_arm_condbranch | @ CHECK: @   fixup A - offset: 0, value: _baz, kind: fixup_arm_condbranch | ||||||
|  | @ CHECK-BE: beq	_baz                    @ encoding: [0x0a,A,A,A] | ||||||
|  | @ CHECK-BE: @   fixup A - offset: 0, value: _baz, kind: fixup_arm_condbranch | ||||||
|  |  | ||||||
|  |  | ||||||
| @------------------------------------------------------------------------------ | @------------------------------------------------------------------------------ | ||||||
| @@ -420,10 +429,16 @@ Lforward: | |||||||
|  |  | ||||||
| @ CHECK: bl  _bar @ encoding: [A,A,A,0xeb] | @ CHECK: bl  _bar @ encoding: [A,A,A,0xeb] | ||||||
| @ CHECK:   @   fixup A - offset: 0, value: _bar, kind: fixup_arm_uncondbl | @ CHECK:   @   fixup A - offset: 0, value: _bar, kind: fixup_arm_uncondbl | ||||||
|  | @ CHECK-BE: bl  _bar @ encoding: [0xeb,A,A,A] | ||||||
|  | @ CHECK-BE:   @   fixup A - offset: 0, value: _bar, kind: fixup_arm_uncondbl | ||||||
| @ CHECK: bleq  _bar @ encoding: [A,A,A,0x0b] | @ CHECK: bleq  _bar @ encoding: [A,A,A,0x0b] | ||||||
| @ CHECK:   @   fixup A - offset: 0, value: _bar, kind: fixup_arm_condbl | @ CHECK:   @   fixup A - offset: 0, value: _bar, kind: fixup_arm_condbl | ||||||
|  | @ CHECK-BE: bleq  _bar @ encoding: [0x0b,A,A,A] | ||||||
|  | @ CHECK-BE:   @   fixup A - offset: 0, value: _bar, kind: fixup_arm_condbl | ||||||
| @ CHECK: blx	_bar @ encoding: [A,A,A,0xfa] | @ CHECK: blx	_bar @ encoding: [A,A,A,0xfa] | ||||||
|            @   fixup A - offset: 0, value: _bar, kind: fixup_arm_blx | @ CHECK:   @   fixup A - offset: 0, value: _bar, kind: fixup_arm_blx | ||||||
|  | @ CHECK-BE: blx	_bar @ encoding: [0xfa,A,A,A] | ||||||
|  | @ CHECK-BE:   @   fixup A - offset: 0, value: _bar, kind: fixup_arm_blx | ||||||
| @ CHECK: blls	#28634268               @ encoding: [0x27,0x3b,0x6d,0x9b] | @ CHECK: blls	#28634268               @ encoding: [0x27,0x3b,0x6d,0x9b] | ||||||
| @ CHECK: blx	#32424576               @ encoding: [0xa0,0xb0,0x7b,0xfa] | @ CHECK: blx	#32424576               @ encoding: [0xa0,0xb0,0x7b,0xfa] | ||||||
| @ CHECK: blx	#16212288               @ encoding: [0x50,0xd8,0x3d,0xfa] | @ CHECK: blx	#16212288               @ encoding: [0x50,0xd8,0x3d,0xfa] | ||||||
|   | |||||||
| @@ -4,6 +4,7 @@ | |||||||
| @--- | @--- | ||||||
| @ RUN: llvm-mc -triple=thumbv6-apple-darwin -show-encoding < %s | FileCheck %s | @ RUN: llvm-mc -triple=thumbv6-apple-darwin -show-encoding < %s | FileCheck %s | ||||||
| @ RUN: llvm-mc -triple=thumbv7-apple-darwin -show-encoding < %s | FileCheck %s | @ RUN: llvm-mc -triple=thumbv7-apple-darwin -show-encoding < %s | FileCheck %s | ||||||
|  | @ RUN: llvm-mc -triple=thumbebv7-unknown-unknown -show-encoding < %s | FileCheck --check-prefix=CHECK-BE %s | ||||||
|   .syntax unified |   .syntax unified | ||||||
|   .globl _func |   .globl _func | ||||||
|  |  | ||||||
| @@ -90,7 +91,9 @@ _func: | |||||||
|         adr r3, #1020 |         adr r3, #1020 | ||||||
|  |  | ||||||
| @ CHECK: adr	r2, _baz                @ encoding: [A,0xa2] | @ CHECK: adr	r2, _baz                @ encoding: [A,0xa2] | ||||||
|             @   fixup A - offset: 0, value: _baz, kind: fixup_thumb_adr_pcrel_10 | @ CHECK:    @   fixup A - offset: 0, value: _baz, kind: fixup_thumb_adr_pcrel_10 | ||||||
|  | @ CHECK-BE: adr	r2, _baz                @ encoding: [0xa2,A] | ||||||
|  | @ CHECK-BE:    @   fixup A - offset: 0, value: _baz, kind: fixup_thumb_adr_pcrel_10 | ||||||
| @ CHECK: adr	r5, #0                  @ encoding: [0x00,0xa5] | @ CHECK: adr	r5, #0                  @ encoding: [0x00,0xa5] | ||||||
| @ CHECK: adr	r2, #4                  @ encoding: [0x01,0xa2] | @ CHECK: adr	r2, #4                  @ encoding: [0x01,0xa2] | ||||||
| @ CHECK: adr	r3, #1020               @ encoding: [0xff,0xa3] | @ CHECK: adr	r3, #1020               @ encoding: [0xff,0xa3] | ||||||
| @@ -132,9 +135,13 @@ _func: | |||||||
|         beq     #160 |         beq     #160 | ||||||
|  |  | ||||||
| @ CHECK: b	_baz                    @ encoding: [A,0xe0'A'] | @ CHECK: b	_baz                    @ encoding: [A,0xe0'A'] | ||||||
|              @   fixup A - offset: 0, value: _baz, kind: fixup_arm_thumb_br | @ CHECK:     @   fixup A - offset: 0, value: _baz, kind: fixup_arm_thumb_br | ||||||
|  | @ CHECK-BE: b	_baz                    @ encoding: [0xe0'A',A] | ||||||
|  | @ CHECK-BE:     @   fixup A - offset: 0, value: _baz, kind: fixup_arm_thumb_br | ||||||
| @ CHECK: beq	_bar                    @ encoding: [A,0xd0] | @ CHECK: beq	_bar                    @ encoding: [A,0xd0] | ||||||
|              @   fixup A - offset: 0, value: _bar, kind: fixup_arm_thumb_bcc | @ CHECK:     @   fixup A - offset: 0, value: _bar, kind: fixup_arm_thumb_bcc | ||||||
|  | @ CHECK-BE: beq	_bar                    @ encoding: [0xd0,A] | ||||||
|  | @ CHECK-BE:     @   fixup A - offset: 0, value: _bar, kind: fixup_arm_thumb_bcc | ||||||
| @ CHECK: b       #1838                   @ encoding: [0x97,0xe3] | @ CHECK: b       #1838                   @ encoding: [0x97,0xe3] | ||||||
| @ CHECK: b       #-420                   @ encoding: [0x2e,0xe7] | @ CHECK: b       #-420                   @ encoding: [0x2e,0xe7] | ||||||
| @ CHECK: beq     #-256                   @ encoding: [0x80,0xd0] | @ CHECK: beq     #-256                   @ encoding: [0x80,0xd0] | ||||||
| @@ -174,9 +181,13 @@ _func: | |||||||
|         blx _baz |         blx _baz | ||||||
|  |  | ||||||
| @ CHECK: bl	_bar                    @ encoding: [A,0xf0'A',A,0xd0'A'] | @ CHECK: bl	_bar                    @ encoding: [A,0xf0'A',A,0xd0'A'] | ||||||
|              @   fixup A - offset: 0, value: _bar, kind: fixup_arm_thumb_bl | @ CHECK:     @   fixup A - offset: 0, value: _bar, kind: fixup_arm_thumb_bl | ||||||
|  | @ CHECK-BE: bl	_bar                    @ encoding: [0xf0'A',A,0xd0'A',A] | ||||||
|  | @ CHECK-BE:     @   fixup A - offset: 0, value: _bar, kind: fixup_arm_thumb_bl | ||||||
| @ CHECK: blx	_baz                    @ encoding: [A,0xf0'A',A,0xc0'A'] | @ CHECK: blx	_baz                    @ encoding: [A,0xf0'A',A,0xc0'A'] | ||||||
|              @   fixup A - offset: 0, value: _baz, kind: fixup_arm_thumb_blx | @ CHECK:     @   fixup A - offset: 0, value: _baz, kind: fixup_arm_thumb_blx | ||||||
|  | @ CHECK-BE: blx	_baz                    @ encoding: [0xf0'A',A,0xc0'A',A] | ||||||
|  | @ CHECK-BE:     @   fixup A - offset: 0, value: _baz, kind: fixup_arm_thumb_blx | ||||||
|  |  | ||||||
|  |  | ||||||
| @------------------------------------------------------------------------------ | @------------------------------------------------------------------------------ | ||||||
| @@ -272,7 +283,9 @@ _func: | |||||||
|         ldr     r3, #368 |         ldr     r3, #368 | ||||||
|  |  | ||||||
| @ CHECK: ldr	r1, _foo                @ encoding: [A,0x49] | @ CHECK: ldr	r1, _foo                @ encoding: [A,0x49] | ||||||
|              @   fixup A - offset: 0, value: _foo, kind: fixup_arm_thumb_cp | @ CHECK:     @   fixup A - offset: 0, value: _foo, kind: fixup_arm_thumb_cp | ||||||
|  | @ CHECK-BE: ldr	r1, _foo                @ encoding: [0x49,A] | ||||||
|  | @ CHECK-BE:     @   fixup A - offset: 0, value: _foo, kind: fixup_arm_thumb_cp | ||||||
| @ CHECK: ldr     r3, [pc, #604]         @ encoding: [0x97,0x4b] | @ CHECK: ldr     r3, [pc, #604]         @ encoding: [0x97,0x4b] | ||||||
| @ CHECK: ldr     r3, [pc, #368]         @ encoding: [0x5c,0x4b] | @ CHECK: ldr     r3, [pc, #368]         @ encoding: [0x5c,0x4b] | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,4 +1,5 @@ | |||||||
| @ RUN: llvm-mc -triple=thumbv7-apple-darwin -mcpu=cortex-a8 -show-encoding < %s | FileCheck %s | @ RUN: llvm-mc -triple=thumbv7-apple-darwin -mcpu=cortex-a8 -show-encoding < %s | FileCheck %s | ||||||
|  | @ RUN: llvm-mc -triple=thumbebv7-unknown-unknown -mcpu=cortex-a8 -show-encoding < %s | FileCheck --check-prefix=CHECK-BE %s | ||||||
|   .syntax unified |   .syntax unified | ||||||
|   .globl _func |   .globl _func | ||||||
|  |  | ||||||
| @@ -227,12 +228,18 @@ _func: | |||||||
|         bmi.w   #-183396 |         bmi.w   #-183396 | ||||||
|  |  | ||||||
| @ CHECK: b.w	_bar                    @ encoding: [A,0xf0'A',A,0x90'A'] | @ CHECK: b.w	_bar                    @ encoding: [A,0xf0'A',A,0x90'A'] | ||||||
|           @   fixup A - offset: 0, value: _bar, kind: fixup_t2_uncondbranch | @ CHECK:  @   fixup A - offset: 0, value: _bar, kind: fixup_t2_uncondbranch | ||||||
|  | @ CHECK-BE: b.w	_bar                    @ encoding: [0xf0'A',A,0x90'A',A] | ||||||
|  | @ CHECK-BE:  @   fixup A - offset: 0, value: _bar, kind: fixup_t2_uncondbranch | ||||||
| @ CHECK: beq.w	_bar                    @ encoding: [A,0xf0'A',A,0x80'A'] | @ CHECK: beq.w	_bar                    @ encoding: [A,0xf0'A',A,0x80'A'] | ||||||
|           @   fixup A - offset: 0, value: _bar, kind: fixup_t2_condbranch | @ CHECK:  @   fixup A - offset: 0, value: _bar, kind: fixup_t2_condbranch | ||||||
|  | @ CHECK-BE: beq.w	_bar                    @ encoding: [0xf0'A',A,0x80'A',A] | ||||||
|  | @ CHECK-BE:  @   fixup A - offset: 0, value: _bar, kind: fixup_t2_condbranch | ||||||
| @ CHECK: it	eq                      @ encoding: [0x08,0xbf] | @ CHECK: it	eq                      @ encoding: [0x08,0xbf] | ||||||
| @ CHECK: beq.w	_bar                    @ encoding: [A,0xf0'A',A,0x90'A'] | @ CHECK: beq.w	_bar                    @ encoding: [A,0xf0'A',A,0x90'A'] | ||||||
|           @   fixup A - offset: 0, value: _bar, kind: fixup_t2_uncondbranch | @ CHECK:  @   fixup A - offset: 0, value: _bar, kind: fixup_t2_uncondbranch | ||||||
|  | @ CHECK-BE: beq.w	_bar                    @ encoding: [0xf0'A',A,0x90'A',A] | ||||||
|  | @ CHECK-BE:  @   fixup A - offset: 0, value: _bar, kind: fixup_t2_uncondbranch | ||||||
| @ CHECK: bmi.w   #-183396                @ encoding: [0x13,0xf5,0xce,0xa9] | @ CHECK: bmi.w   #-183396                @ encoding: [0x13,0xf5,0xce,0xa9] | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -332,9 +339,13 @@ _func: | |||||||
| @ CHECK: cbnz    r7, #6                  @ encoding: [0x1f,0xb9] | @ CHECK: cbnz    r7, #6                  @ encoding: [0x1f,0xb9] | ||||||
| @ CHECK: cbnz    r7, #12                 @ encoding: [0x37,0xb9] | @ CHECK: cbnz    r7, #12                 @ encoding: [0x37,0xb9] | ||||||
| @ CHECK: cbz	r6, _bar                @ encoding: [0x06'A',0xb1'A'] | @ CHECK: cbz	r6, _bar                @ encoding: [0x06'A',0xb1'A'] | ||||||
|            @   fixup A - offset: 0, value: _bar, kind: fixup_arm_thumb_cb | @ CHECK:   @   fixup A - offset: 0, value: _bar, kind: fixup_arm_thumb_cb | ||||||
|  | @ CHECK-BE: cbz	r6, _bar                @ encoding: [0xb1'A',0x06'A'] | ||||||
|  | @ CHECK-BE:   @   fixup A - offset: 0, value: _bar, kind: fixup_arm_thumb_cb | ||||||
| @ CHECK: cbnz	r6, _bar                @ encoding: [0x06'A',0xb9'A'] | @ CHECK: cbnz	r6, _bar                @ encoding: [0x06'A',0xb9'A'] | ||||||
|            @   fixup A - offset: 0, value: _bar, kind: fixup_arm_thumb_cb | @ CHECK:   @   fixup A - offset: 0, value: _bar, kind: fixup_arm_thumb_cb | ||||||
|  | @ CHECK-BE: cbnz	r6, _bar                @ encoding: [0xb9'A',0x06'A'] | ||||||
|  | @ CHECK-BE:   @   fixup A - offset: 0, value: _bar, kind: fixup_arm_thumb_cb | ||||||
|  |  | ||||||
|  |  | ||||||
| @------------------------------------------------------------------------------ | @------------------------------------------------------------------------------ | ||||||
| @@ -804,10 +815,16 @@ _func: | |||||||
|  |  | ||||||
| @ CHECK: ldr.w	r5, _foo                @ encoding: [0x5f'A',0xf8'A',A,0x50'A'] | @ CHECK: ldr.w	r5, _foo                @ encoding: [0x5f'A',0xf8'A',A,0x50'A'] | ||||||
| @ CHECK: @   fixup A - offset: 0, value: _foo, kind: fixup_t2_ldst_pcrel_12 | @ CHECK: @   fixup A - offset: 0, value: _foo, kind: fixup_t2_ldst_pcrel_12 | ||||||
|  | @ CHECK-BE: ldr.w	r5, _foo                @ encoding: [0xf8'A',0x5f'A',0x50'A',A] | ||||||
|  | @ CHECK-BE: @   fixup A - offset: 0, value: _foo, kind: fixup_t2_ldst_pcrel_12 | ||||||
| @ CHECK: ldr.w	lr, _strcmp-4           @ encoding: [0x5f'A',0xf8'A',A,0xe0'A'] | @ CHECK: ldr.w	lr, _strcmp-4           @ encoding: [0x5f'A',0xf8'A',A,0xe0'A'] | ||||||
| @ CHECK: @   fixup A - offset: 0, value: _strcmp-4, kind: fixup_t2_ldst_pcrel_12 | @ CHECK: @   fixup A - offset: 0, value: _strcmp-4, kind: fixup_t2_ldst_pcrel_12 | ||||||
|  | @ CHECK-BE: ldr.w	lr, _strcmp-4           @ encoding: [0xf8'A',0x5f'A',0xe0'A',A] | ||||||
|  | @ CHECK-BE: @   fixup A - offset: 0, value: _strcmp-4, kind: fixup_t2_ldst_pcrel_12 | ||||||
| @ CHECK: ldr.w sp, _foo                 @ encoding: [0x5f'A',0xf8'A',A,0xd0'A'] | @ CHECK: ldr.w sp, _foo                 @ encoding: [0x5f'A',0xf8'A',A,0xd0'A'] | ||||||
| @ CHECK: @   fixup A - offset: 0, value: _foo, kind: fixup_t2_ldst_pcrel_12 | @ CHECK: @   fixup A - offset: 0, value: _foo, kind: fixup_t2_ldst_pcrel_12 | ||||||
|  | @ CHECK-BE: ldr.w sp, _foo                 @ encoding: [0xf8'A',0x5f'A',0xd0'A',A] | ||||||
|  | @ CHECK-BE: @   fixup A - offset: 0, value: _foo, kind: fixup_t2_ldst_pcrel_12 | ||||||
|  |  | ||||||
|         ldr r7, [pc, #8] |         ldr r7, [pc, #8] | ||||||
|         ldr.n r7, [pc, #8] |         ldr.n r7, [pc, #8] | ||||||
| @@ -1027,6 +1044,8 @@ _func: | |||||||
|  |  | ||||||
| @ CHECK: ldrh.w	r5, _bar                @ encoding: [0x3f'A',0xf8'A',A,0x50'A'] | @ CHECK: ldrh.w	r5, _bar                @ encoding: [0x3f'A',0xf8'A',A,0x50'A'] | ||||||
| @ CHECK:     @   fixup A - offset: 0, value: _bar, kind: fixup_t2_ldst_pcrel_12 | @ CHECK:     @   fixup A - offset: 0, value: _bar, kind: fixup_t2_ldst_pcrel_12 | ||||||
|  | @ CHECK-BE: ldrh.w	r5, _bar                @ encoding: [0xf8'A',0x3f'A',0x50'A',A] | ||||||
|  | @ CHECK-BE:     @   fixup A - offset: 0, value: _bar, kind: fixup_t2_ldst_pcrel_12 | ||||||
|  |  | ||||||
|  |  | ||||||
| @------------------------------------------------------------------------------ | @------------------------------------------------------------------------------ | ||||||
| @@ -1096,6 +1115,8 @@ _func: | |||||||
|  |  | ||||||
| @ CHECK: ldrsb.w r5, _bar               @ encoding: [0x1f'A',0xf9'A',A,0x50'A'] | @ CHECK: ldrsb.w r5, _bar               @ encoding: [0x1f'A',0xf9'A',A,0x50'A'] | ||||||
| @ CHECK:      @   fixup A - offset: 0, value: _bar, kind: fixup_t2_ldst_pcrel_12 | @ CHECK:      @   fixup A - offset: 0, value: _bar, kind: fixup_t2_ldst_pcrel_12 | ||||||
|  | @ CHECK-BE: ldrsb.w r5, _bar               @ encoding: [0xf9'A',0x1f'A',0x50'A',A] | ||||||
|  | @ CHECK-BE:      @   fixup A - offset: 0, value: _bar, kind: fixup_t2_ldst_pcrel_12 | ||||||
|  |  | ||||||
|  |  | ||||||
| @------------------------------------------------------------------------------ | @------------------------------------------------------------------------------ | ||||||
| @@ -1165,6 +1186,8 @@ _func: | |||||||
|  |  | ||||||
| @ CHECK: ldrsh.w r5, _bar               @ encoding: [0x3f'A',0xf9'A',A,0x50'A'] | @ CHECK: ldrsh.w r5, _bar               @ encoding: [0x3f'A',0xf9'A',A,0x50'A'] | ||||||
| @ CHECK:      @   fixup A - offset: 0, value: _bar, kind: fixup_t2_ldst_pcrel_12 | @ CHECK:      @   fixup A - offset: 0, value: _bar, kind: fixup_t2_ldst_pcrel_12 | ||||||
|  | @ CHECK-BE: ldrsh.w r5, _bar               @ encoding: [0xf9'A',0x3f'A',0x50'A',A] | ||||||
|  | @ CHECK-BE:      @   fixup A - offset: 0, value: _bar, kind: fixup_t2_ldst_pcrel_12 | ||||||
|  |  | ||||||
| @ TEMPORARILY DISABLED: | @ TEMPORARILY DISABLED: | ||||||
| @        ldrsh.w r4, [pc, #1435] | @        ldrsh.w r4, [pc, #1435] | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user