diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2016-07-23 20:41:05 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2016-07-23 20:41:05 +0000 |
| commit | 01095a5d43bbfde13731688ddcf6048ebb8b7721 (patch) | |
| tree | 4def12e759965de927d963ac65840d663ef9d1ea /lib/Target/AVR/MCTargetDesc | |
| parent | f0f4822ed4b66e3579e92a89f368f8fb860e218e (diff) | |
Diffstat (limited to 'lib/Target/AVR/MCTargetDesc')
| -rw-r--r-- | lib/Target/AVR/MCTargetDesc/AVRELFStreamer.cpp | 66 | ||||
| -rw-r--r-- | lib/Target/AVR/MCTargetDesc/AVRELFStreamer.h | 29 | ||||
| -rw-r--r-- | lib/Target/AVR/MCTargetDesc/AVRMCAsmInfo.cpp | 28 | ||||
| -rw-r--r-- | lib/Target/AVR/MCTargetDesc/AVRMCAsmInfo.h | 31 | ||||
| -rw-r--r-- | lib/Target/AVR/MCTargetDesc/AVRMCTargetDesc.h | 57 | ||||
| -rw-r--r-- | lib/Target/AVR/MCTargetDesc/AVRTargetStreamer.cpp | 24 | ||||
| -rw-r--r-- | lib/Target/AVR/MCTargetDesc/AVRTargetStreamer.h | 32 | ||||
| -rw-r--r-- | lib/Target/AVR/MCTargetDesc/CMakeLists.txt | 8 | ||||
| -rw-r--r-- | lib/Target/AVR/MCTargetDesc/LLVMBuild.txt | 23 |
9 files changed, 298 insertions, 0 deletions
diff --git a/lib/Target/AVR/MCTargetDesc/AVRELFStreamer.cpp b/lib/Target/AVR/MCTargetDesc/AVRELFStreamer.cpp new file mode 100644 index 0000000000000..481de320b22fe --- /dev/null +++ b/lib/Target/AVR/MCTargetDesc/AVRELFStreamer.cpp @@ -0,0 +1,66 @@ +#include "AVRELFStreamer.h" + +#include "llvm/Support/ELF.h" +#include "llvm/Support/FormattedStream.h" + +#include "AVRMCTargetDesc.h" + +namespace llvm { + +static unsigned getEFlagsForFeatureSet(const FeatureBitset &Features) { + unsigned EFlags = 0; + + // Set architecture + if (Features[AVR::ELFArchAVR1]) + EFlags |= ELF::EF_AVR_ARCH_AVR1; + else if (Features[AVR::ELFArchAVR2]) + EFlags |= ELF::EF_AVR_ARCH_AVR2; + else if (Features[AVR::ELFArchAVR25]) + EFlags |= ELF::EF_AVR_ARCH_AVR25; + else if (Features[AVR::ELFArchAVR3]) + EFlags |= ELF::EF_AVR_ARCH_AVR3; + else if (Features[AVR::ELFArchAVR31]) + EFlags |= ELF::EF_AVR_ARCH_AVR31; + else if (Features[AVR::ELFArchAVR35]) + EFlags |= ELF::EF_AVR_ARCH_AVR35; + else if (Features[AVR::ELFArchAVR4]) + EFlags |= ELF::EF_AVR_ARCH_AVR4; + else if (Features[AVR::ELFArchAVR5]) + EFlags |= ELF::EF_AVR_ARCH_AVR5; + else if (Features[AVR::ELFArchAVR51]) + EFlags |= ELF::EF_AVR_ARCH_AVR51; + else if (Features[AVR::ELFArchAVR6]) + EFlags |= ELF::EF_AVR_ARCH_AVR6; + else if (Features[AVR::ELFArchAVRTiny]) + EFlags |= ELF::EF_AVR_ARCH_AVRTINY; + else if (Features[AVR::ELFArchXMEGA1]) + EFlags |= ELF::EF_AVR_ARCH_XMEGA1; + else if (Features[AVR::ELFArchXMEGA2]) + EFlags |= ELF::EF_AVR_ARCH_XMEGA2; + else if (Features[AVR::ELFArchXMEGA3]) + EFlags |= ELF::EF_AVR_ARCH_XMEGA3; + else if (Features[AVR::ELFArchXMEGA4]) + EFlags |= ELF::EF_AVR_ARCH_XMEGA4; + else if (Features[AVR::ELFArchXMEGA5]) + EFlags |= ELF::EF_AVR_ARCH_XMEGA5; + else if (Features[AVR::ELFArchXMEGA6]) + EFlags |= ELF::EF_AVR_ARCH_XMEGA6; + else if (Features[AVR::ELFArchXMEGA7]) + EFlags |= ELF::EF_AVR_ARCH_XMEGA7; + + return EFlags; +} + +AVRELFStreamer::AVRELFStreamer(MCStreamer &S, + const MCSubtargetInfo &STI) + : AVRTargetStreamer(S) { + + MCAssembler &MCA = getStreamer().getAssembler(); + unsigned EFlags = MCA.getELFHeaderEFlags(); + + EFlags |= getEFlagsForFeatureSet(STI.getFeatureBits()); + + MCA.setELFHeaderEFlags(EFlags); +} + +} // end namespace llvm diff --git a/lib/Target/AVR/MCTargetDesc/AVRELFStreamer.h b/lib/Target/AVR/MCTargetDesc/AVRELFStreamer.h new file mode 100644 index 0000000000000..e5df6cc34e402 --- /dev/null +++ b/lib/Target/AVR/MCTargetDesc/AVRELFStreamer.h @@ -0,0 +1,29 @@ +//===----- AVRELFStreamer.h - AVR Target Streamer --------------*- C++ -*--===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_AVR_ELF_STREAMER_H +#define LLVM_AVR_ELF_STREAMER_H + +#include "AVRTargetStreamer.h" + +namespace llvm { + +/// A target streamer for an AVR ELF object file. +class AVRELFStreamer : public AVRTargetStreamer { +public: + AVRELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI); + + MCELFStreamer &getStreamer() { + return static_cast<MCELFStreamer &>(Streamer); + } +}; + +} // end namespace llvm + +#endif diff --git a/lib/Target/AVR/MCTargetDesc/AVRMCAsmInfo.cpp b/lib/Target/AVR/MCTargetDesc/AVRMCAsmInfo.cpp new file mode 100644 index 0000000000000..cca3bcc4968ab --- /dev/null +++ b/lib/Target/AVR/MCTargetDesc/AVRMCAsmInfo.cpp @@ -0,0 +1,28 @@ +//===-- AVRMCAsmInfo.cpp - AVR asm properties -----------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file contains the declarations of the AVRMCAsmInfo properties. +// +//===----------------------------------------------------------------------===// + +#include "AVRMCAsmInfo.h" + +#include "llvm/ADT/Triple.h" + +namespace llvm { + +AVRMCAsmInfo::AVRMCAsmInfo(const Triple &TT) { + PointerSize = 2; + CalleeSaveStackSlotSize = 2; + CommentString = ";"; + PrivateGlobalPrefix = ".L"; + UsesELFSectionDirectiveForBSS = true; +} + +} // end of namespace llvm diff --git a/lib/Target/AVR/MCTargetDesc/AVRMCAsmInfo.h b/lib/Target/AVR/MCTargetDesc/AVRMCAsmInfo.h new file mode 100644 index 0000000000000..cc2207a3cfaec --- /dev/null +++ b/lib/Target/AVR/MCTargetDesc/AVRMCAsmInfo.h @@ -0,0 +1,31 @@ +//===-- AVRMCAsmInfo.h - AVR asm properties ---------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file contains the declaration of the AVRMCAsmInfo class. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_AVR_ASM_INFO_H +#define LLVM_AVR_ASM_INFO_H + +#include "llvm/MC/MCAsmInfo.h" + +namespace llvm { + +class Triple; + +/// Specifies the format of AVR assembly files. +class AVRMCAsmInfo : public MCAsmInfo { +public: + explicit AVRMCAsmInfo(const Triple &TT); +}; + +} // end namespace llvm + +#endif // LLVM_AVR_ASM_INFO_H diff --git a/lib/Target/AVR/MCTargetDesc/AVRMCTargetDesc.h b/lib/Target/AVR/MCTargetDesc/AVRMCTargetDesc.h new file mode 100644 index 0000000000000..b72793d0fab42 --- /dev/null +++ b/lib/Target/AVR/MCTargetDesc/AVRMCTargetDesc.h @@ -0,0 +1,57 @@ +//===-- AVRMCTargetDesc.h - AVR Target Descriptions -------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file provides AVR specific target descriptions. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_AVR_MCTARGET_DESC_H +#define LLVM_AVR_MCTARGET_DESC_H + +#include "llvm/Support/DataTypes.h" + +namespace llvm { + +class MCAsmBackend; +class MCCodeEmitter; +class MCContext; +class MCInstrInfo; +class MCObjectWriter; +class MCRegisterInfo; +class StringRef; +class Target; +class Triple; +class raw_pwrite_stream; + +extern Target TheAVRTarget; + +/// Creates a machine code emitter for AVR. +MCCodeEmitter *createAVRMCCodeEmitter(const MCInstrInfo &MCII, + const MCRegisterInfo &MRI, + MCContext &Ctx); + +/// Creates an assembly backend for AVR. +MCAsmBackend *createAVRAsmBackend(const Target &T, const MCRegisterInfo &MRI, + const Triple &TT, StringRef CPU); + +/// Creates an ELF object writer for AVR. +MCObjectWriter *createAVRELFObjectWriter(raw_pwrite_stream &OS, uint8_t OSABI); + +} // end namespace llvm + +#define GET_REGINFO_ENUM +#include "AVRGenRegisterInfo.inc" + +#define GET_INSTRINFO_ENUM +#include "AVRGenInstrInfo.inc" + +#define GET_SUBTARGETINFO_ENUM +#include "AVRGenSubtargetInfo.inc" + +#endif // LLVM_AVR_MCTARGET_DESC_H diff --git a/lib/Target/AVR/MCTargetDesc/AVRTargetStreamer.cpp b/lib/Target/AVR/MCTargetDesc/AVRTargetStreamer.cpp new file mode 100644 index 0000000000000..a2d8c16eeb8ca --- /dev/null +++ b/lib/Target/AVR/MCTargetDesc/AVRTargetStreamer.cpp @@ -0,0 +1,24 @@ +//===-- AVRTargetStreamer.cpp - AVR Target Streamer Methods ---------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file provides AVR specific target streamer methods. +// +//===----------------------------------------------------------------------===// + +#include "AVRTargetStreamer.h" + +namespace llvm { + +AVRTargetStreamer::AVRTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {} + +AVRTargetAsmStreamer::AVRTargetAsmStreamer(MCStreamer &S) + : AVRTargetStreamer(S) {} + +} // end namespace llvm + diff --git a/lib/Target/AVR/MCTargetDesc/AVRTargetStreamer.h b/lib/Target/AVR/MCTargetDesc/AVRTargetStreamer.h new file mode 100644 index 0000000000000..99a536699ae93 --- /dev/null +++ b/lib/Target/AVR/MCTargetDesc/AVRTargetStreamer.h @@ -0,0 +1,32 @@ +//===-- AVRTargetStreamer.h - AVR Target Streamer --------------*- C++ -*--===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_AVR_TARGET_STREAMER_H +#define LLVM_AVR_TARGET_STREAMER_H + +#include "llvm/MC/MCELFStreamer.h" + +namespace llvm { +class MCStreamer; + +/// A generic AVR target output stream. +class AVRTargetStreamer : public MCTargetStreamer { +public: + explicit AVRTargetStreamer(MCStreamer &S); +}; + +/// A target streamer for textual AVR assembly code. +class AVRTargetAsmStreamer : public AVRTargetStreamer { +public: + explicit AVRTargetAsmStreamer(MCStreamer &S); +}; + +} // end namespace llvm + +#endif // LLVM_AVR_TARGET_STREAMER_H diff --git a/lib/Target/AVR/MCTargetDesc/CMakeLists.txt b/lib/Target/AVR/MCTargetDesc/CMakeLists.txt new file mode 100644 index 0000000000000..3cceb49acb30f --- /dev/null +++ b/lib/Target/AVR/MCTargetDesc/CMakeLists.txt @@ -0,0 +1,8 @@ +add_llvm_library(LLVMAVRDesc + AVRELFStreamer.cpp + AVRMCAsmInfo.cpp + AVRTargetStreamer.cpp +) + +add_dependencies(LLVMAVRDesc AVRCommonTableGen) + diff --git a/lib/Target/AVR/MCTargetDesc/LLVMBuild.txt b/lib/Target/AVR/MCTargetDesc/LLVMBuild.txt new file mode 100644 index 0000000000000..8786f563cdc81 --- /dev/null +++ b/lib/Target/AVR/MCTargetDesc/LLVMBuild.txt @@ -0,0 +1,23 @@ +;===- ./lib/Target/AVR/MCTargetDesc/LLVMBuild.txt --------------*- Conf -*--===; +; +; The LLVM Compiler Infrastructure +; +; This file is distributed under the University of Illinois Open Source +; License. See LICENSE.TXT for details. +; +;===------------------------------------------------------------------------===; +; +; This is an LLVMBuild description file for the components in this subdirectory. +; +; For more information on the LLVMBuild system, please see: +; +; http://llvm.org/docs/LLVMBuild.html +; +;===------------------------------------------------------------------------===; + +[component_0] +type = Library +name = AVRDesc +parent = AVR +required_libraries = MC AVRInfo Support +add_to_library_groups = AVR |
