[llvm] r239071 - [bpf] add big- and host- endian support
Eric Christopher
echristo at gmail.com
Thu Jun 4 12:24:23 PDT 2015
It doesn't look like anyone actually approved this? (I know, it was in my
list of things to look at :)
-eric
On Thu, Jun 4, 2015 at 12:23 PM Alexei Starovoitov <
alexei.starovoitov at gmail.com> wrote:
> Author: ast
> Date: Thu Jun 4 14:15:05 2015
> New Revision: 239071
>
> URL: http://llvm.org/viewvc/llvm-project?rev=239071&view=rev
> Log:
> [bpf] add big- and host- endian support
>
> Summary:
> -march=bpf -> host endian
> -march=bpf_le -> little endian
> -match=bpf_be -> big endian
>
> Test Plan:
> v1 was tested by IBM s390 guys and appears to be working there.
> It bit rots too fast here.
>
> Reviewers: chandlerc, tstellarAMD
>
> Subscribers: llvm-commits
>
> Differential Revision: http://reviews.llvm.org/D10177
>
> Added:
> llvm/trunk/test/CodeGen/BPF/cc_args_be.ll
> - copied, changed from r239069,
> llvm/trunk/test/CodeGen/BPF/cc_args.ll
> Modified:
> llvm/trunk/include/llvm/ADT/Triple.h
> llvm/trunk/lib/Support/Triple.cpp
> llvm/trunk/lib/Target/BPF/BPFAsmPrinter.cpp
> llvm/trunk/lib/Target/BPF/BPFTargetMachine.cpp
> llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFAsmBackend.cpp
> llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFELFObjectWriter.cpp
> llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFMCAsmInfo.h
> llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFMCCodeEmitter.cpp
> llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFMCTargetDesc.cpp
> llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFMCTargetDesc.h
> llvm/trunk/lib/Target/BPF/TargetInfo/BPFTargetInfo.cpp
> llvm/trunk/test/CodeGen/BPF/alu8.ll
> llvm/trunk/test/CodeGen/BPF/atomics.ll
> llvm/trunk/test/CodeGen/BPF/basictest.ll
> llvm/trunk/test/CodeGen/BPF/cc_args.ll
> llvm/trunk/test/CodeGen/BPF/cc_ret.ll
> llvm/trunk/test/CodeGen/BPF/ex1.ll
> llvm/trunk/test/CodeGen/BPF/intrinsics.ll
> llvm/trunk/test/CodeGen/BPF/load.ll
> llvm/trunk/test/CodeGen/BPF/loops.ll
> llvm/trunk/test/CodeGen/BPF/sanity.ll
> llvm/trunk/test/CodeGen/BPF/setcc.ll
> llvm/trunk/test/CodeGen/BPF/shifts.ll
> llvm/trunk/test/CodeGen/BPF/sockex2.ll
>
> Modified: llvm/trunk/include/llvm/ADT/Triple.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/Triple.h?rev=239071&r1=239070&r2=239071&view=diff
>
> ==============================================================================
> --- llvm/trunk/include/llvm/ADT/Triple.h (original)
> +++ llvm/trunk/include/llvm/ADT/Triple.h Thu Jun 4 14:15:05 2015
> @@ -50,7 +50,8 @@ public:
> armeb, // ARM (big endian): armeb
> aarch64, // AArch64 (little endian): aarch64
> aarch64_be, // AArch64 (big endian): aarch64_be
> - bpf, // eBPF or extended BPF or 64-bit BPF (little endian)
> + bpf_le, // eBPF or extended BPF or 64-bit BPF (little endian)
> + bpf_be, // eBPF or extended BPF or 64-bit BPF (big endian)
> hexagon, // Hexagon: hexagon
> mips, // MIPS: mips, mipsallegrex
> mipsel, // MIPSEL: mipsel, mipsallegrexel
>
> Modified: llvm/trunk/lib/Support/Triple.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Triple.cpp?rev=239071&r1=239070&r2=239071&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Support/Triple.cpp (original)
> +++ llvm/trunk/lib/Support/Triple.cpp Thu Jun 4 14:15:05 2015
> @@ -13,6 +13,7 @@
> #include "llvm/ADT/StringSwitch.h"
> #include "llvm/Support/ErrorHandling.h"
> #include "llvm/Support/TargetParser.h"
> +#include "llvm/Support/Host.h"
> #include <cstring>
> using namespace llvm;
>
> @@ -24,7 +25,8 @@ const char *Triple::getArchTypeName(Arch
> case aarch64_be: return "aarch64_be";
> case arm: return "arm";
> case armeb: return "armeb";
> - case bpf: return "bpf";
> + case bpf_le: return "bpf_le";
> + case bpf_be: return "bpf_be";
> case hexagon: return "hexagon";
> case mips: return "mips";
> case mipsel: return "mipsel";
> @@ -89,7 +91,8 @@ const char *Triple::getArchTypePrefix(Ar
> case amdgcn:
> case r600: return "amdgpu";
>
> - case bpf: return "bpf";
> + case bpf_le:
> + case bpf_be: return "bpf";
>
> case sparcv9:
> case sparcel:
> @@ -192,14 +195,30 @@ const char *Triple::getEnvironmentTypeNa
> llvm_unreachable("Invalid EnvironmentType!");
> }
>
> +static Triple::ArchType parseBPFArch(StringRef ArchName) {
> + if (ArchName.equals("bpf")) {
> + if (sys::IsLittleEndianHost)
> + return Triple::bpf_le;
> + else
> + return Triple::bpf_be;
> + } else if (ArchName.equals("bpf_be")) {
> + return Triple::bpf_be;
> + } else if (ArchName.equals("bpf_le")) {
> + return Triple::bpf_le;
> + } else {
> + return Triple::UnknownArch;
> + }
> +}
> +
> Triple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) {
> + Triple::ArchType BPFArch(parseBPFArch(Name));
> return StringSwitch<Triple::ArchType>(Name)
> .Case("aarch64", aarch64)
> .Case("aarch64_be", aarch64_be)
> .Case("arm64", aarch64) // "arm64" is an alias for "aarch64"
> .Case("arm", arm)
> .Case("armeb", armeb)
> - .Case("bpf", bpf)
> + .StartsWith("bpf", BPFArch)
> .Case("mips", mips)
> .Case("mipsel", mipsel)
> .Case("mips64", mips64)
> @@ -296,6 +315,7 @@ static Triple::ArchType parseARMArch(Str
>
> static Triple::ArchType parseArch(StringRef ArchName) {
> Triple::ArchType ARMArch(parseARMArch(ArchName));
> + Triple::ArchType BPFArch(parseBPFArch(ArchName));
>
> return StringSwitch<Triple::ArchType>(ArchName)
> .Cases("i386", "i486", "i586", "i686", Triple::x86)
> @@ -317,7 +337,7 @@ static Triple::ArchType parseArch(String
> .Case("mips64el", Triple::mips64el)
> .Case("r600", Triple::r600)
> .Case("amdgcn", Triple::amdgcn)
> - .Case("bpf", Triple::bpf)
> + .StartsWith("bpf", BPFArch)
> .Case("hexagon", Triple::hexagon)
> .Case("s390x", Triple::systemz)
> .Case("sparc", Triple::sparc)
> @@ -989,7 +1009,8 @@ static unsigned getArchPointerBitWidth(l
> case llvm::Triple::aarch64:
> case llvm::Triple::aarch64_be:
> case llvm::Triple::amdgcn:
> - case llvm::Triple::bpf:
> + case llvm::Triple::bpf_le:
> + case llvm::Triple::bpf_be:
> case llvm::Triple::le64:
> case llvm::Triple::mips64:
> case llvm::Triple::mips64el:
> @@ -1026,7 +1047,8 @@ Triple Triple::get32BitArchVariant() con
> case Triple::aarch64:
> case Triple::aarch64_be:
> case Triple::amdgcn:
> - case Triple::bpf:
> + case Triple::bpf_le:
> + case Triple::bpf_be:
> case Triple::msp430:
> case Triple::systemz:
> case Triple::ppc64le:
> @@ -1090,7 +1112,8 @@ Triple Triple::get64BitArchVariant() con
>
> case Triple::aarch64:
> case Triple::aarch64_be:
> - case Triple::bpf:
> + case Triple::bpf_le:
> + case Triple::bpf_be:
> case Triple::le64:
> case Triple::amdil64:
> case Triple::amdgcn:
>
> Modified: llvm/trunk/lib/Target/BPF/BPFAsmPrinter.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/BPF/BPFAsmPrinter.cpp?rev=239071&r1=239070&r2=239071&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/BPF/BPFAsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/BPF/BPFAsmPrinter.cpp Thu Jun 4 14:15:05 2015
> @@ -83,5 +83,7 @@ void BPFAsmPrinter::EmitInstruction(cons
>
> // Force static initialization.
> extern "C" void LLVMInitializeBPFAsmPrinter() {
> - RegisterAsmPrinter<BPFAsmPrinter> X(TheBPFTarget);
> + RegisterAsmPrinter<BPFAsmPrinter> X(TheBPFleTarget);
> + RegisterAsmPrinter<BPFAsmPrinter> Y(TheBPFbeTarget);
> + RegisterAsmPrinter<BPFAsmPrinter> Z(TheBPFTarget);
> }
>
> Modified: llvm/trunk/lib/Target/BPF/BPFTargetMachine.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/BPF/BPFTargetMachine.cpp?rev=239071&r1=239070&r2=239071&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/BPF/BPFTargetMachine.cpp (original)
> +++ llvm/trunk/lib/Target/BPF/BPFTargetMachine.cpp Thu Jun 4 14:15:05 2015
> @@ -23,19 +23,24 @@ using namespace llvm;
>
> extern "C" void LLVMInitializeBPFTarget() {
> // Register the target.
> - RegisterTargetMachine<BPFTargetMachine> X(TheBPFTarget);
> + RegisterTargetMachine<BPFTargetMachine> X(TheBPFleTarget);
> + RegisterTargetMachine<BPFTargetMachine> Y(TheBPFbeTarget);
> + RegisterTargetMachine<BPFTargetMachine> Z(TheBPFTarget);
> +}
> +
> +// DataLayout: little or big endian
> +static std::string computeDataLayout(StringRef TT) {
> + if (Triple(TT).getArch() == Triple::bpf_be)
> + return "E-m:e-p:64:64-i64:64-n32:64-S128";
> + else
> + return "e-m:e-p:64:64-i64:64-n32:64-S128";
> }
>
> -// DataLayout --> Little-endian, 64-bit pointer/ABI/alignment
> -// The stack is always 8 byte aligned
> -// On function prologue, the stack is created by decrementing
> -// its pointer. Once decremented, all references are done with positive
> -// offset from the stack/frame pointer.
> BPFTargetMachine::BPFTargetMachine(const Target &T, StringRef TT,
> StringRef CPU,
> StringRef FS, const TargetOptions
> &Options,
> Reloc::Model RM, CodeModel::Model CM,
> CodeGenOpt::Level OL)
> - : LLVMTargetMachine(T, "e-m:e-p:64:64-i64:64-n32:64-S128", TT, CPU,
> FS,
> + : LLVMTargetMachine(T, computeDataLayout(TT), TT, CPU, FS,
> Options, RM, CM, OL),
> TLOF(make_unique<TargetLoweringObjectFileELF>()),
> Subtarget(TT, CPU, FS, *this) {
>
> Modified: llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFAsmBackend.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFAsmBackend.cpp?rev=239071&r1=239070&r2=239071&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFAsmBackend.cpp (original)
> +++ llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFAsmBackend.cpp Thu Jun 4
> 14:15:05 2015
> @@ -25,7 +25,10 @@ using namespace llvm;
> namespace {
> class BPFAsmBackend : public MCAsmBackend {
> public:
> - BPFAsmBackend() : MCAsmBackend() {}
> + bool IsLittleEndian;
> +
> + BPFAsmBackend(bool IsLittleEndian)
> + : MCAsmBackend(), IsLittleEndian(IsLittleEndian) {}
> ~BPFAsmBackend() override {}
>
> void applyFixup(const MCFixup &Fixup, char *Data, unsigned DataSize,
> @@ -69,17 +72,28 @@ void BPFAsmBackend::applyFixup(const MCF
> }
> assert(Fixup.getKind() == FK_PCRel_2);
> Value = (uint16_t)((Value - 8) / 8);
> - Data[Fixup.getOffset() + 2] = Value & 0xFF;
> - Data[Fixup.getOffset() + 3] = Value >> 8;
> + if (IsLittleEndian) {
> + Data[Fixup.getOffset() + 2] = Value & 0xFF;
> + Data[Fixup.getOffset() + 3] = Value >> 8;
> + } else {
> + Data[Fixup.getOffset() + 2] = Value >> 8;
> + Data[Fixup.getOffset() + 3] = Value & 0xFF;
> + }
> }
>
> MCObjectWriter *BPFAsmBackend::createObjectWriter(raw_pwrite_stream &OS)
> const {
> - return createBPFELFObjectWriter(OS, 0);
> + return createBPFELFObjectWriter(OS, 0, IsLittleEndian);
> }
> }
>
> MCAsmBackend *llvm::createBPFAsmBackend(const Target &T,
> const MCRegisterInfo &MRI,
> StringRef TT,
> StringRef CPU) {
> - return new BPFAsmBackend();
> + return new BPFAsmBackend(/*IsLittleEndian=*/true);
> +}
> +
> +MCAsmBackend *llvm::createBPFbeAsmBackend(const Target &T,
> + const MCRegisterInfo &MRI,
> StringRef TT,
> + StringRef CPU) {
> + return new BPFAsmBackend(/*IsLittleEndian=*/false);
> }
>
> Modified: llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFELFObjectWriter.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFELFObjectWriter.cpp?rev=239071&r1=239070&r2=239071&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFELFObjectWriter.cpp
> (original)
> +++ llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFELFObjectWriter.cpp Thu Jun
> 4 14:15:05 2015
> @@ -47,7 +47,8 @@ unsigned BPFELFObjectWriter::GetRelocTyp
> }
> }
>
> -MCObjectWriter *llvm::createBPFELFObjectWriter(raw_pwrite_stream &OS,
> uint8_t OSABI) {
> +MCObjectWriter *llvm::createBPFELFObjectWriter(raw_pwrite_stream &OS,
> + uint8_t OSABI, bool
> IsLittleEndian) {
> MCELFObjectTargetWriter *MOTW = new BPFELFObjectWriter(OSABI);
> - return createELFObjectWriter(MOTW, OS, /*IsLittleEndian=*/true);
> + return createELFObjectWriter(MOTW, OS, IsLittleEndian);
> }
>
> Modified: llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFMCAsmInfo.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFMCAsmInfo.h?rev=239071&r1=239070&r2=239071&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFMCAsmInfo.h (original)
> +++ llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFMCAsmInfo.h Thu Jun 4
> 14:15:05 2015
> @@ -16,6 +16,7 @@
>
> #include "llvm/ADT/StringRef.h"
> #include "llvm/MC/MCAsmInfo.h"
> +#include "llvm/ADT/Triple.h"
>
> namespace llvm {
> class Target;
> @@ -24,6 +25,9 @@ class Triple;
> class BPFMCAsmInfo : public MCAsmInfo {
> public:
> explicit BPFMCAsmInfo(const Triple &TT) {
> + if (TT.getArch() == Triple::bpf_be)
> + IsLittleEndian = false;
> +
> PrivateGlobalPrefix = ".L";
> WeakRefDirective = "\t.weak\t";
>
>
> Modified: llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFMCCodeEmitter.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFMCCodeEmitter.cpp?rev=239071&r1=239070&r2=239071&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFMCCodeEmitter.cpp (original)
> +++ llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFMCCodeEmitter.cpp Thu Jun 4
> 14:15:05 2015
> @@ -30,9 +30,11 @@ class BPFMCCodeEmitter : public MCCodeEm
> BPFMCCodeEmitter(const BPFMCCodeEmitter &) = delete;
> void operator=(const BPFMCCodeEmitter &) = delete;
> const MCRegisterInfo &MRI;
> + bool IsLittleEndian;
>
> public:
> - BPFMCCodeEmitter(const MCRegisterInfo &mri) : MRI(mri) {}
> + BPFMCCodeEmitter(const MCRegisterInfo &mri, bool IsLittleEndian)
> + : MRI(mri), IsLittleEndian(IsLittleEndian) {}
>
> ~BPFMCCodeEmitter() {}
>
> @@ -61,7 +63,13 @@ public:
> MCCodeEmitter *llvm::createBPFMCCodeEmitter(const MCInstrInfo &MCII,
> const MCRegisterInfo &MRI,
> MCContext &Ctx) {
> - return new BPFMCCodeEmitter(MRI);
> + return new BPFMCCodeEmitter(MRI, true);
> +}
> +
> +MCCodeEmitter *llvm::createBPFbeMCCodeEmitter(const MCInstrInfo &MCII,
> + const MCRegisterInfo &MRI,
> + MCContext &Ctx) {
> + return new BPFMCCodeEmitter(MRI, false);
> }
>
> unsigned BPFMCCodeEmitter::getMachineOpValue(const MCInst &MI,
> @@ -91,32 +99,53 @@ unsigned BPFMCCodeEmitter::getMachineOpV
> return 0;
> }
>
> +static uint8_t SwapBits(uint8_t Val)
> +{
> + return (Val & 0x0F) << 4 | (Val & 0xF0) >> 4;
> +}
> +
> void BPFMCCodeEmitter::encodeInstruction(const MCInst &MI, raw_ostream
> &OS,
> SmallVectorImpl<MCFixup> &Fixups,
> const MCSubtargetInfo &STI)
> const {
> unsigned Opcode = MI.getOpcode();
> support::endian::Writer<support::little> LE(OS);
> + support::endian::Writer<support::big> BE(OS);
>
> if (Opcode == BPF::LD_imm64 || Opcode == BPF::LD_pseudo) {
> uint64_t Value = getBinaryCodeForInstr(MI, Fixups, STI);
> LE.write<uint8_t>(Value >> 56);
> - LE.write<uint8_t>(((Value >> 48) & 0xff));
> + if (IsLittleEndian)
> + LE.write<uint8_t>((Value >> 48) & 0xff);
> + else
> + LE.write<uint8_t>(SwapBits((Value >> 48) & 0xff));
> LE.write<uint16_t>(0);
> - LE.write<uint32_t>(Value & 0xffffFFFF);
> + if (IsLittleEndian)
> + LE.write<uint32_t>(Value & 0xffffFFFF);
> + else
> + BE.write<uint32_t>(Value & 0xffffFFFF);
>
> const MCOperand &MO = MI.getOperand(1);
> uint64_t Imm = MO.isImm() ? MO.getImm() : 0;
> LE.write<uint8_t>(0);
> LE.write<uint8_t>(0);
> LE.write<uint16_t>(0);
> - LE.write<uint32_t>(Imm >> 32);
> + if (IsLittleEndian)
> + LE.write<uint32_t>(Imm >> 32);
> + else
> + BE.write<uint32_t>(Imm >> 32);
> } else {
> // Get instruction encoding and emit it
> uint64_t Value = getBinaryCodeForInstr(MI, Fixups, STI);
> LE.write<uint8_t>(Value >> 56);
> - LE.write<uint8_t>((Value >> 48) & 0xff);
> - LE.write<uint16_t>((Value >> 32) & 0xffff);
> - LE.write<uint32_t>(Value & 0xffffFFFF);
> + if (IsLittleEndian) {
> + LE.write<uint8_t>((Value >> 48) & 0xff);
> + LE.write<uint16_t>((Value >> 32) & 0xffff);
> + LE.write<uint32_t>(Value & 0xffffFFFF);
> + } else {
> + LE.write<uint8_t>(SwapBits((Value >> 48) & 0xff));
> + BE.write<uint16_t>((Value >> 32) & 0xffff);
> + BE.write<uint32_t>(Value & 0xffffFFFF);
> + }
> }
> }
>
>
> Modified: llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFMCTargetDesc.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFMCTargetDesc.cpp?rev=239071&r1=239070&r2=239071&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFMCTargetDesc.cpp (original)
> +++ llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFMCTargetDesc.cpp Thu Jun 4
> 14:15:05 2015
> @@ -79,32 +79,43 @@ static MCInstPrinter *createBPFMCInstPri
> }
>
> extern "C" void LLVMInitializeBPFTargetMC() {
> - // Register the MC asm info.
> - RegisterMCAsmInfo<BPFMCAsmInfo> X(TheBPFTarget);
> + for (Target *T : {&TheBPFleTarget, &TheBPFbeTarget, &TheBPFTarget}) {
> + // Register the MC asm info.
> + RegisterMCAsmInfo<BPFMCAsmInfo> X(*T);
>
> - // Register the MC codegen info.
> - TargetRegistry::RegisterMCCodeGenInfo(TheBPFTarget,
> createBPFMCCodeGenInfo);
> + // Register the MC codegen info.
> + TargetRegistry::RegisterMCCodeGenInfo(*T, createBPFMCCodeGenInfo);
>
> - // Register the MC instruction info.
> - TargetRegistry::RegisterMCInstrInfo(TheBPFTarget, createBPFMCInstrInfo);
> + // Register the MC instruction info.
> + TargetRegistry::RegisterMCInstrInfo(*T, createBPFMCInstrInfo);
>
> - // Register the MC register info.
> - TargetRegistry::RegisterMCRegInfo(TheBPFTarget,
> createBPFMCRegisterInfo);
> + // Register the MC register info.
> + TargetRegistry::RegisterMCRegInfo(*T, createBPFMCRegisterInfo);
>
> - // Register the MC subtarget info.
> - TargetRegistry::RegisterMCSubtargetInfo(TheBPFTarget,
> - createBPFMCSubtargetInfo);
> + // Register the MC subtarget info.
> + TargetRegistry::RegisterMCSubtargetInfo(*T,
> + createBPFMCSubtargetInfo);
> +
> + // Register the object streamer
> + TargetRegistry::RegisterELFStreamer(*T, createBPFMCStreamer);
> +
> + // Register the MCInstPrinter.
> + TargetRegistry::RegisterMCInstPrinter(*T, createBPFMCInstPrinter);
> + }
>
> // Register the MC code emitter
> - TargetRegistry::RegisterMCCodeEmitter(TheBPFTarget,
> - llvm::createBPFMCCodeEmitter);
> + TargetRegistry::RegisterMCCodeEmitter(TheBPFleTarget,
> createBPFMCCodeEmitter);
> + TargetRegistry::RegisterMCCodeEmitter(TheBPFbeTarget,
> createBPFbeMCCodeEmitter);
>
> // Register the ASM Backend
> - TargetRegistry::RegisterMCAsmBackend(TheBPFTarget, createBPFAsmBackend);
> -
> - // Register the object streamer
> - TargetRegistry::RegisterELFStreamer(TheBPFTarget, createBPFMCStreamer);
> + TargetRegistry::RegisterMCAsmBackend(TheBPFleTarget,
> createBPFAsmBackend);
> + TargetRegistry::RegisterMCAsmBackend(TheBPFbeTarget,
> createBPFbeAsmBackend);
>
> - // Register the MCInstPrinter.
> - TargetRegistry::RegisterMCInstPrinter(TheBPFTarget,
> createBPFMCInstPrinter);
> + if (sys::IsLittleEndianHost) {
> + TargetRegistry::RegisterMCCodeEmitter(TheBPFTarget,
> createBPFMCCodeEmitter);
> + TargetRegistry::RegisterMCAsmBackend(TheBPFTarget,
> createBPFAsmBackend);
> + } else {
> + TargetRegistry::RegisterMCCodeEmitter(TheBPFTarget,
> createBPFbeMCCodeEmitter);
> + TargetRegistry::RegisterMCAsmBackend(TheBPFTarget,
> createBPFbeAsmBackend);
> + }
> }
>
> Modified: llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFMCTargetDesc.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFMCTargetDesc.h?rev=239071&r1=239070&r2=239071&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFMCTargetDesc.h (original)
> +++ llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFMCTargetDesc.h Thu Jun 4
> 14:15:05 2015
> @@ -30,16 +30,24 @@ class StringRef;
> class raw_ostream;
> class raw_pwrite_stream;
>
> +extern Target TheBPFleTarget;
> +extern Target TheBPFbeTarget;
> extern Target TheBPFTarget;
>
> MCCodeEmitter *createBPFMCCodeEmitter(const MCInstrInfo &MCII,
> const MCRegisterInfo &MRI,
> MCContext &Ctx);
> +MCCodeEmitter *createBPFbeMCCodeEmitter(const MCInstrInfo &MCII,
> + const MCRegisterInfo &MRI,
> + MCContext &Ctx);
>
> MCAsmBackend *createBPFAsmBackend(const Target &T, const MCRegisterInfo
> &MRI,
> StringRef TT, StringRef CPU);
> +MCAsmBackend *createBPFbeAsmBackend(const Target &T, const MCRegisterInfo
> &MRI,
> + StringRef TT, StringRef CPU);
>
> -MCObjectWriter *createBPFELFObjectWriter(raw_pwrite_stream &OS, uint8_t
> OSABI);
> +MCObjectWriter *createBPFELFObjectWriter(raw_pwrite_stream &OS,
> + uint8_t OSABI, bool
> IsLittleEndian);
> }
>
> // Defines symbolic names for BPF registers. This defines a mapping from
>
> Modified: llvm/trunk/lib/Target/BPF/TargetInfo/BPFTargetInfo.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/BPF/TargetInfo/BPFTargetInfo.cpp?rev=239071&r1=239070&r2=239071&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/BPF/TargetInfo/BPFTargetInfo.cpp (original)
> +++ llvm/trunk/lib/Target/BPF/TargetInfo/BPFTargetInfo.cpp Thu Jun 4
> 14:15:05 2015
> @@ -11,8 +11,18 @@
> #include "llvm/Support/TargetRegistry.h"
> using namespace llvm;
>
> -Target llvm::TheBPFTarget;
> +namespace llvm {
> +Target TheBPFleTarget;
> +Target TheBPFbeTarget;
> +Target TheBPFTarget;
> +}
>
> extern "C" void LLVMInitializeBPFTargetInfo() {
> - RegisterTarget<Triple::bpf, /*HasJIT=*/true> X(TheBPFTarget, "bpf",
> "BPF");
> + TargetRegistry::RegisterTarget(TheBPFTarget, "bpf",
> + "BPF (host endian)",
> + [](Triple::ArchType) { return false; },
> true);
> + RegisterTarget<Triple::bpf_le, /*HasJIT=*/true> X(
> + TheBPFleTarget, "bpf_le", "BPF (little endian)");
> + RegisterTarget<Triple::bpf_be, /*HasJIT=*/true> Y(
> + TheBPFbeTarget, "bpf_be", "BPF (big endian)");
> }
>
> Modified: llvm/trunk/test/CodeGen/BPF/alu8.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/BPF/alu8.ll?rev=239071&r1=239070&r2=239071&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/BPF/alu8.ll (original)
> +++ llvm/trunk/test/CodeGen/BPF/alu8.ll Thu Jun 4 14:15:05 2015
> @@ -1,5 +1,4 @@
> -; RUN: llc -march=bpf -show-mc-encoding < %s | FileCheck %s
> -; test little endian only for now
> +; RUN: llc -march=bpf_le -show-mc-encoding < %s | FileCheck %s
>
> define i8 @mov(i8 %a, i8 %b) nounwind {
> ; CHECK-LABEL: mov:
>
> Modified: llvm/trunk/test/CodeGen/BPF/atomics.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/BPF/atomics.ll?rev=239071&r1=239070&r2=239071&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/BPF/atomics.ll (original)
> +++ llvm/trunk/test/CodeGen/BPF/atomics.ll Thu Jun 4 14:15:05 2015
> @@ -1,5 +1,4 @@
> -; RUN: llc < %s -march=bpf -verify-machineinstrs -show-mc-encoding |
> FileCheck %s
> -; test little endian only for now
> +; RUN: llc < %s -march=bpf_le -verify-machineinstrs -show-mc-encoding |
> FileCheck %s
>
> ; CHECK-LABEL: test_load_add_32
> ; CHECK: xadd32
>
> Modified: llvm/trunk/test/CodeGen/BPF/basictest.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/BPF/basictest.ll?rev=239071&r1=239070&r2=239071&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/BPF/basictest.ll (original)
> +++ llvm/trunk/test/CodeGen/BPF/basictest.ll Thu Jun 4 14:15:05 2015
> @@ -1,4 +1,4 @@
> -; RUN: llc < %s -march=bpf | FileCheck %s
> +; RUN: llc < %s -march=bpf_le | FileCheck %s
>
> define i32 @test0(i32 %X) {
> %tmp.1 = add i32 %X, 1
>
> Modified: llvm/trunk/test/CodeGen/BPF/cc_args.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/BPF/cc_args.ll?rev=239071&r1=239070&r2=239071&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/BPF/cc_args.ll (original)
> +++ llvm/trunk/test/CodeGen/BPF/cc_args.ll Thu Jun 4 14:15:05 2015
> @@ -1,5 +1,4 @@
> -; RUN: llc < %s -march=bpf -show-mc-encoding | FileCheck %s
> -; test little endian only for now
> +; RUN: llc < %s -march=bpf_le -show-mc-encoding | FileCheck %s
>
> define void @test() #0 {
> entry:
>
> Copied: llvm/trunk/test/CodeGen/BPF/cc_args_be.ll (from r239069,
> llvm/trunk/test/CodeGen/BPF/cc_args.ll)
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/BPF/cc_args_be.ll?p2=llvm/trunk/test/CodeGen/BPF/cc_args_be.ll&p1=llvm/trunk/test/CodeGen/BPF/cc_args.ll&r1=239069&r2=239071&rev=239071&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/BPF/cc_args.ll (original)
> +++ llvm/trunk/test/CodeGen/BPF/cc_args_be.ll Thu Jun 4 14:15:05 2015
> @@ -1,19 +1,19 @@
> -; RUN: llc < %s -march=bpf -show-mc-encoding | FileCheck %s
> -; test little endian only for now
> +; RUN: llc < %s -march=bpf_be -show-mc-encoding | FileCheck %s
> +; test big endian
>
> define void @test() #0 {
> entry:
> ; CHECK: test:
>
> -; CHECK: mov r1, 123 # encoding:
> [0xb7,0x01,0x00,0x00,0x7b,0x00,0x00,0x00]
> +; CHECK: mov r1, 123 # encoding:
> [0xb7,0x10,0x00,0x00,0x00,0x00,0x00,0x7b]
> ; CHECK: call f_i16
> call void @f_i16(i16 123)
>
> -; CHECK: mov r1, 12345678 # encoding:
> [0xb7,0x01,0x00,0x00,0x4e,0x61,0xbc,0x00]
> +; CHECK: mov r1, 12345678 # encoding:
> [0xb7,0x10,0x00,0x00,0x00,0xbc,0x61,0x4e]
> ; CHECK: call f_i32
> call void @f_i32(i32 12345678)
>
> -; CHECK: ld_64 r1, 72623859790382856 # encoding:
> [0x18,0x01,0x00,0x00,0x08,0x07,0x06,0x05,0x00,0x00,0x00,0x00,0x04,0x03,0x02,0x01]
> +; CHECK: ld_64 r1, 72623859790382856 # encoding:
> [0x18,0x10,0x00,0x00,0x05,0x06,0x07,0x08,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04]
> ; CHECK: call f_i64
> call void @f_i64(i64 72623859790382856)
>
> @@ -43,23 +43,23 @@ entry:
>
> define void @f_i16(i16 %a) #0 {
> ; CHECK: f_i16:
> -; CHECK: sth 0(r2), r1 # encoding:
> [0x6b,0x12,0x00,0x00,0x00,0x00,0x00,0x00]
> +; CHECK: sth 0(r2), r1 # encoding:
> [0x6b,0x21,0x00,0x00,0x00,0x00,0x00,0x00]
> store volatile i16 %a, i16* @g_i16, align 2
> ret void
> }
>
> define void @f_i32(i32 %a) #0 {
> ; CHECK: f_i32:
> -; CHECK: sth 0(r2), r1 # encoding:
> [0x6b,0x12,0x00,0x00,0x00,0x00,0x00,0x00]
> -; CHECK: sth 2(r2), r1 # encoding:
> [0x6b,0x12,0x02,0x00,0x00,0x00,0x00,0x00]
> +; CHECK: sth 2(r2), r1 # encoding:
> [0x6b,0x21,0x00,0x02,0x00,0x00,0x00,0x00]
> +; CHECK: sth 0(r2), r1 # encoding:
> [0x6b,0x21,0x00,0x00,0x00,0x00,0x00,0x00]
> store volatile i32 %a, i32* @g_i32, align 2
> ret void
> }
>
> define void @f_i64(i64 %a) #0 {
> ; CHECK: f_i64:
> +; CHECK: stw 4(r2), r1 # encoding:
> [0x63,0x21,0x00,0x04,0x00,0x00,0x00,0x00]
> ; CHECK: stw 0(r2), r1
> -; CHECK: stw 4(r2), r1 # encoding:
> [0x63,0x12,0x04,0x00,0x00,0x00,0x00,0x00]
> store volatile i64 %a, i64* @g_i64, align 2
> ret void
> }
> @@ -88,7 +88,7 @@ define void @f_i16_i64_i16(i16 %a, i64 %
> ; CHECK: f_i16_i64_i16:
> ; CHECK: sth 0(r4), r1
> store volatile i16 %a, i16* @g_i16, align 2
> -; CHECK: std 0(r1), r2 # encoding:
> [0x7b,0x21,0x00,0x00,0x00,0x00,0x00,0x00]
> +; CHECK: std 0(r1), r2 # encoding:
> [0x7b,0x12,0x00,0x00,0x00,0x00,0x00,0x00]
> store volatile i64 %b, i64* @g_i64, align 8
> ; CHECK: sth 0(r4), r3
> store volatile i16 %c, i16* @g_i16, align 2
>
> Modified: llvm/trunk/test/CodeGen/BPF/cc_ret.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/BPF/cc_ret.ll?rev=239071&r1=239070&r2=239071&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/BPF/cc_ret.ll (original)
> +++ llvm/trunk/test/CodeGen/BPF/cc_ret.ll Thu Jun 4 14:15:05 2015
> @@ -1,4 +1,4 @@
> -; RUN: llc < %s -march=bpf | FileCheck %s
> +; RUN: llc < %s -march=bpf_le | FileCheck %s
>
> define void @test() #0 {
> entry:
>
> Modified: llvm/trunk/test/CodeGen/BPF/ex1.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/BPF/ex1.ll?rev=239071&r1=239070&r2=239071&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/BPF/ex1.ll (original)
> +++ llvm/trunk/test/CodeGen/BPF/ex1.ll Thu Jun 4 14:15:05 2015
> @@ -1,4 +1,4 @@
> -; RUN: llc < %s -march=bpf | FileCheck %s
> +; RUN: llc < %s -march=bpf_le | FileCheck %s
>
> %struct.bpf_context = type { i64, i64, i64, i64, i64, i64, i64 }
> %struct.sk_buff = type { i64, i64, i64, i64, i64, i64, i64 }
>
> Modified: llvm/trunk/test/CodeGen/BPF/intrinsics.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/BPF/intrinsics.ll?rev=239071&r1=239070&r2=239071&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/BPF/intrinsics.ll (original)
> +++ llvm/trunk/test/CodeGen/BPF/intrinsics.ll Thu Jun 4 14:15:05 2015
> @@ -1,4 +1,4 @@
> -; RUN: llc < %s -march=bpf -show-mc-encoding | FileCheck %s
> +; RUN: llc < %s -march=bpf_le -show-mc-encoding | FileCheck %s
>
> ; Function Attrs: nounwind uwtable
> define i32 @ld_b(i64 %foo, i64* nocapture %bar, i8* %ctx, i8* %ctx2) #0 {
>
> Modified: llvm/trunk/test/CodeGen/BPF/load.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/BPF/load.ll?rev=239071&r1=239070&r2=239071&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/BPF/load.ll (original)
> +++ llvm/trunk/test/CodeGen/BPF/load.ll Thu Jun 4 14:15:05 2015
> @@ -1,4 +1,4 @@
> -; RUN: llc < %s -march=bpf | FileCheck %s
> +; RUN: llc < %s -march=bpf_le | FileCheck %s
>
> define i16 @am1(i16* %a) nounwind {
> %1 = load i16, i16* %a
>
> Modified: llvm/trunk/test/CodeGen/BPF/loops.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/BPF/loops.ll?rev=239071&r1=239070&r2=239071&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/BPF/loops.ll (original)
> +++ llvm/trunk/test/CodeGen/BPF/loops.ll Thu Jun 4 14:15:05 2015
> @@ -1,4 +1,4 @@
> -; RUN: llc < %s -march=bpf | FileCheck %s
> +; RUN: llc < %s -march=bpf_le | FileCheck %s
>
> define zeroext i16 @add(i16* nocapture %a, i16 zeroext %n) nounwind
> readonly {
> entry:
>
> Modified: llvm/trunk/test/CodeGen/BPF/sanity.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/BPF/sanity.ll?rev=239071&r1=239070&r2=239071&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/BPF/sanity.ll (original)
> +++ llvm/trunk/test/CodeGen/BPF/sanity.ll Thu Jun 4 14:15:05 2015
> @@ -1,4 +1,4 @@
> -; RUN: llc < %s -march=bpf | FileCheck %s
> +; RUN: llc < %s -march=bpf_le | FileCheck %s
>
> @foo_printf.fmt = private unnamed_addr constant [9 x i8] c"hello
> \0A\00", align 1
>
>
> Modified: llvm/trunk/test/CodeGen/BPF/setcc.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/BPF/setcc.ll?rev=239071&r1=239070&r2=239071&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/BPF/setcc.ll (original)
> +++ llvm/trunk/test/CodeGen/BPF/setcc.ll Thu Jun 4 14:15:05 2015
> @@ -1,4 +1,4 @@
> -; RUN: llc -march=bpf < %s | FileCheck %s
> +; RUN: llc -march=bpf_le < %s | FileCheck %s
>
> define i16 @sccweqand(i16 %a, i16 %b) nounwind {
> %t1 = and i16 %a, %b
>
> Modified: llvm/trunk/test/CodeGen/BPF/shifts.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/BPF/shifts.ll?rev=239071&r1=239070&r2=239071&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/BPF/shifts.ll (original)
> +++ llvm/trunk/test/CodeGen/BPF/shifts.ll Thu Jun 4 14:15:05 2015
> @@ -1,5 +1,4 @@
> -; RUN: llc < %s -march=bpf -show-mc-encoding | FileCheck %s
> -; test little endian only for now
> +; RUN: llc < %s -march=bpf_le -show-mc-encoding | FileCheck %s
>
> define zeroext i8 @lshr8(i8 zeroext %a, i8 zeroext %cnt) nounwind
> readnone {
> entry:
>
> Modified: llvm/trunk/test/CodeGen/BPF/sockex2.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/BPF/sockex2.ll?rev=239071&r1=239070&r2=239071&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/CodeGen/BPF/sockex2.ll (original)
> +++ llvm/trunk/test/CodeGen/BPF/sockex2.ll Thu Jun 4 14:15:05 2015
> @@ -1,5 +1,4 @@
> -; RUN: llc < %s -march=bpf -show-mc-encoding | FileCheck %s
> -; test little endian only for now
> +; RUN: llc < %s -march=bpf_le -show-mc-encoding | FileCheck %s
>
> %struct.bpf_map_def = type { i32, i32, i32, i32 }
> %struct.sk_buff = type opaque
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150604/f7a228d0/attachment.html>
More information about the llvm-commits
mailing list