Skip to content

Commit 53355ce

Browse files
committed
[ARC] Add ARC backend.
Add the ARC backend as an experimental target to lib/Target. Reviewed at: https://reviews.llvm.org/D36331 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@311667 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent f372a9f commit 53355ce

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+6360
-0
lines changed

CODE_OWNERS.TXT

+4
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ N: Greg Clayton
4444
4545
D: LLDB
4646

47+
N: Pete Couperus
48+
49+
D: ARC backend (lib/Target/ARC/*)
50+
4751
N: Sanjoy Das
4852
4953
D: IndVar Simplify, Scalar Evolution

include/llvm/ADT/Triple.h

+1
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class Triple {
5050
armeb, // ARM (big endian): armeb
5151
aarch64, // AArch64 (little endian): aarch64
5252
aarch64_be, // AArch64 (big endian): aarch64_be
53+
arc, // ARC: Synopsys ARC
5354
avr, // AVR: Atmel AVR microcontroller
5455
bpfel, // eBPF or extended BPF or 64-bit BPF (little endian)
5556
bpfeb, // eBPF or extended BPF or 64-bit BPF (big endian)

lib/Support/Triple.cpp

+9
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ StringRef Triple::getArchTypeName(ArchType Kind) {
2525
case aarch64_be: return "aarch64_be";
2626
case arm: return "arm";
2727
case armeb: return "armeb";
28+
case arc: return "arc";
2829
case avr: return "avr";
2930
case bpfel: return "bpfel";
3031
case bpfeb: return "bpfeb";
@@ -83,6 +84,8 @@ StringRef Triple::getArchTypePrefix(ArchType Kind) {
8384
case aarch64:
8485
case aarch64_be: return "aarch64";
8586

87+
case arc: return "arc";
88+
8689
case arm:
8790
case armeb:
8891
case thumb:
@@ -255,6 +258,7 @@ Triple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) {
255258
return StringSwitch<Triple::ArchType>(Name)
256259
.Case("aarch64", aarch64)
257260
.Case("aarch64_be", aarch64_be)
261+
.Case("arc", arc)
258262
.Case("arm64", aarch64) // "arm64" is an alias for "aarch64"
259263
.Case("arm", arm)
260264
.Case("armeb", armeb)
@@ -384,6 +388,7 @@ static Triple::ArchType parseArch(StringRef ArchName) {
384388
.Case("xscaleeb", Triple::armeb)
385389
.Case("aarch64", Triple::aarch64)
386390
.Case("aarch64_be", Triple::aarch64_be)
391+
.Case("arc", Triple::arc)
387392
.Case("arm64", Triple::aarch64)
388393
.Case("arm", Triple::arm)
389394
.Case("armeb", Triple::armeb)
@@ -620,6 +625,7 @@ static Triple::ObjectFormatType getDefaultFormat(const Triple &T) {
620625
return Triple::ELF;
621626

622627
case Triple::aarch64_be:
628+
case Triple::arc:
623629
case Triple::amdgcn:
624630
case Triple::amdil:
625631
case Triple::amdil64:
@@ -1173,6 +1179,7 @@ static unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch) {
11731179
case llvm::Triple::msp430:
11741180
return 16;
11751181

1182+
case llvm::Triple::arc:
11761183
case llvm::Triple::arm:
11771184
case llvm::Triple::armeb:
11781185
case llvm::Triple::hexagon:
@@ -1256,6 +1263,7 @@ Triple Triple::get32BitArchVariant() const {
12561263
case Triple::amdil:
12571264
case Triple::hsail:
12581265
case Triple::spir:
1266+
case Triple::arc:
12591267
case Triple::arm:
12601268
case Triple::armeb:
12611269
case Triple::hexagon:
@@ -1306,6 +1314,7 @@ Triple Triple::get64BitArchVariant() const {
13061314
Triple T(*this);
13071315
switch (getArch()) {
13081316
case Triple::UnknownArch:
1317+
case Triple::arc:
13091318
case Triple::avr:
13101319
case Triple::hexagon:
13111320
case Triple::kalimba:

lib/Target/ARC/ARC.h

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
//===- ARC.h - Top-level interface for ARC representation -------*- C++ -*-===//
2+
//
3+
// The LLVM Compiler Infrastructure
4+
//
5+
// This file is distributed under the University of Illinois Open Source
6+
// License. See LICENSE.TXT for details.
7+
//
8+
//===----------------------------------------------------------------------===//
9+
//
10+
// This file contains the entry points for global functions defined in the LLVM
11+
// ARC back-end.
12+
//
13+
//===----------------------------------------------------------------------===//
14+
15+
#ifndef LLVM_LIB_TARGET_ARC_ARC_H
16+
#define LLVM_LIB_TARGET_ARC_ARC_H
17+
18+
#include "MCTargetDesc/ARCMCTargetDesc.h"
19+
#include "llvm/Target/TargetMachine.h"
20+
21+
namespace llvm {
22+
23+
class FunctionPass;
24+
class ARCTargetMachine;
25+
26+
FunctionPass *createARCISelDag(ARCTargetMachine &TM,
27+
CodeGenOpt::Level OptLevel);
28+
FunctionPass *createARCExpandPseudosPass();
29+
FunctionPass *createARCBranchFinalizePass();
30+
31+
} // end namespace llvm
32+
33+
#endif // LLVM_LIB_TARGET_ARC_ARC_H

lib/Target/ARC/ARC.td

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//===- ARC.td - Describe the ARC Target Machine ------------*- tablegen -*-===//
2+
//
3+
// The LLVM Compiler Infrastructure
4+
//
5+
// This file is distributed under the University of Illinois Open Source
6+
// License. See LICENSE.TXT for details.
7+
//
8+
//===----------------------------------------------------------------------===//
9+
10+
include "llvm/Target/Target.td"
11+
12+
include "ARCRegisterInfo.td"
13+
include "ARCInstrInfo.td"
14+
include "ARCCallingConv.td"
15+
16+
def ARCInstrInfo : InstrInfo;
17+
18+
class Proc<string Name, list<SubtargetFeature> Features>
19+
: Processor<Name, NoItineraries, Features>;
20+
21+
def : Proc<"generic", []>;
22+
23+
def ARC : Target {
24+
let InstructionSet = ARCInstrInfo;
25+
}

lib/Target/ARC/ARCAsmPrinter.cpp

+83
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
//===- ARCAsmPrinter.cpp - ARC LLVM assembly writer -------------*- C++ -*-===//
2+
//
3+
// The LLVM Compiler Infrastructure
4+
//
5+
// This file is distributed under the University of Illinois Open Source
6+
// License. See LICENSE.TXT for details.
7+
//
8+
//===----------------------------------------------------------------------===//
9+
//
10+
// This file contains a printer that converts from our internal representation
11+
// of machine-dependent LLVM code to GNU format ARC assembly language.
12+
//
13+
//===----------------------------------------------------------------------===//
14+
15+
#include "ARC.h"
16+
#include "ARCInstrInfo.h"
17+
#include "ARCMCInstLower.h"
18+
#include "ARCSubtarget.h"
19+
#include "ARCTargetMachine.h"
20+
#include "ARCTargetStreamer.h"
21+
#include "InstPrinter/ARCInstPrinter.h"
22+
#include "llvm/ADT/SmallString.h"
23+
#include "llvm/ADT/StringExtras.h"
24+
#include "llvm/CodeGen/AsmPrinter.h"
25+
#include "llvm/CodeGen/MachineFunctionPass.h"
26+
#include "llvm/CodeGen/MachineInstr.h"
27+
#include "llvm/CodeGen/MachineModuleInfo.h"
28+
#include "llvm/MC/MCAsmInfo.h"
29+
#include "llvm/MC/MCExpr.h"
30+
#include "llvm/MC/MCInst.h"
31+
#include "llvm/MC/MCStreamer.h"
32+
#include "llvm/MC/MCSymbolELF.h"
33+
#include "llvm/Support/ErrorHandling.h"
34+
#include "llvm/Support/TargetRegistry.h"
35+
#include "llvm/Support/raw_ostream.h"
36+
#include "llvm/Target/TargetLoweringObjectFile.h"
37+
#include <algorithm>
38+
39+
using namespace llvm;
40+
41+
#define DEBUG_TYPE "asm-printer"
42+
43+
namespace {
44+
45+
class ARCAsmPrinter : public AsmPrinter {
46+
ARCMCInstLower MCInstLowering;
47+
ARCTargetStreamer &getTargetStreamer();
48+
49+
public:
50+
explicit ARCAsmPrinter(TargetMachine &TM,
51+
std::unique_ptr<MCStreamer> Streamer)
52+
: AsmPrinter(TM, std::move(Streamer)),
53+
MCInstLowering(&OutContext, *this) {}
54+
55+
StringRef getPassName() const override { return "ARC Assembly Printer"; }
56+
void EmitInstruction(const MachineInstr *MI) override;
57+
};
58+
59+
} // end anonymous namespace
60+
61+
ARCTargetStreamer &ARCAsmPrinter::getTargetStreamer() {
62+
return static_cast<ARCTargetStreamer &>(*OutStreamer->getTargetStreamer());
63+
}
64+
65+
void ARCAsmPrinter::EmitInstruction(const MachineInstr *MI) {
66+
SmallString<128> Str;
67+
raw_svector_ostream O(Str);
68+
69+
switch (MI->getOpcode()) {
70+
case ARC::DBG_VALUE:
71+
llvm_unreachable("Should be handled target independently");
72+
break;
73+
}
74+
75+
MCInst TmpInst;
76+
MCInstLowering.Lower(MI, TmpInst);
77+
EmitToStreamer(*OutStreamer, TmpInst);
78+
}
79+
80+
// Force static initialization.
81+
extern "C" void LLVMInitializeARCAsmPrinter() {
82+
RegisterAsmPrinter<ARCAsmPrinter> X(getTheARCTarget());
83+
}

0 commit comments

Comments
 (0)