mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-03 08:51:43 +00:00
Added the first bits of the ARM target assembler to llvm-mc. For now it only
parses the .word directive as 4 bytes and ARMAsmParser::ParseInstruction will give an error is called. Broke out the test of the .word directive into two different test cases, one for x86 and one for arm. llvm-svn: 81817
This commit is contained in:
parent
729869a398
commit
da3290e68c
93
lib/Target/ARM/AsmParser/ARMAsmParser.cpp
Normal file
93
lib/Target/ARM/AsmParser/ARMAsmParser.cpp
Normal file
@ -0,0 +1,93 @@
|
||||
//===-- ARMAsmParser.cpp - Parse ARM assembly to MCInst instructions ------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "ARM.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/ADT/Twine.h"
|
||||
#include "llvm/MC/MCAsmLexer.h"
|
||||
#include "llvm/MC/MCAsmParser.h"
|
||||
#include "llvm/MC/MCStreamer.h"
|
||||
#include "llvm/MC/MCExpr.h"
|
||||
#include "llvm/MC/MCInst.h"
|
||||
#include "llvm/Support/SourceMgr.h"
|
||||
#include "llvm/Target/TargetRegistry.h"
|
||||
#include "llvm/Target/TargetAsmParser.h"
|
||||
using namespace llvm;
|
||||
|
||||
namespace {
|
||||
struct ARMOperand;
|
||||
|
||||
class ARMAsmParser : public TargetAsmParser {
|
||||
MCAsmParser &Parser;
|
||||
|
||||
private:
|
||||
MCAsmParser &getParser() const { return Parser; }
|
||||
|
||||
MCAsmLexer &getLexer() const { return Parser.getLexer(); }
|
||||
|
||||
void Warning(SMLoc L, const Twine &Msg) { Parser.Warning(L, Msg); }
|
||||
|
||||
bool Error(SMLoc L, const Twine &Msg) { return Parser.Error(L, Msg); }
|
||||
|
||||
bool ParseDirectiveWord(unsigned Size, SMLoc L);
|
||||
|
||||
public:
|
||||
ARMAsmParser(const Target &T, MCAsmParser &_Parser)
|
||||
: TargetAsmParser(T), Parser(_Parser) {}
|
||||
|
||||
virtual bool ParseInstruction(const StringRef &Name, MCInst &Inst);
|
||||
|
||||
virtual bool ParseDirective(AsmToken DirectiveID);
|
||||
};
|
||||
|
||||
} // end anonymous namespace
|
||||
|
||||
bool ARMAsmParser::ParseInstruction(const StringRef &Name, MCInst &Inst) {
|
||||
SMLoc Loc = getLexer().getTok().getLoc();
|
||||
Error(Loc, "ARMAsmParser::ParseInstruction currently unimplemented");
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ARMAsmParser::ParseDirective(AsmToken DirectiveID) {
|
||||
StringRef IDVal = DirectiveID.getIdentifier();
|
||||
if (IDVal == ".word")
|
||||
return ParseDirectiveWord(4, DirectiveID.getLoc());
|
||||
return true;
|
||||
}
|
||||
|
||||
/// ParseDirectiveWord
|
||||
/// ::= .word [ expression (, expression)* ]
|
||||
bool ARMAsmParser::ParseDirectiveWord(unsigned Size, SMLoc L) {
|
||||
if (getLexer().isNot(AsmToken::EndOfStatement)) {
|
||||
for (;;) {
|
||||
const MCExpr *Value;
|
||||
if (getParser().ParseExpression(Value))
|
||||
return true;
|
||||
|
||||
getParser().getStreamer().EmitValue(Value, Size);
|
||||
|
||||
if (getLexer().is(AsmToken::EndOfStatement))
|
||||
break;
|
||||
|
||||
// FIXME: Improve diagnostic.
|
||||
if (getLexer().isNot(AsmToken::Comma))
|
||||
return Error(L, "unexpected token in directive");
|
||||
getLexer().Lex();
|
||||
}
|
||||
}
|
||||
|
||||
getLexer().Lex();
|
||||
return false;
|
||||
}
|
||||
|
||||
// Force static initialization.
|
||||
extern "C" void LLVMInitializeARMAsmParser() {
|
||||
RegisterAsmParser<ARMAsmParser> X(TheARMTarget);
|
||||
RegisterAsmParser<ARMAsmParser> Y(TheThumbTarget);
|
||||
}
|
6
lib/Target/ARM/AsmParser/CMakeLists.txt
Normal file
6
lib/Target/ARM/AsmParser/CMakeLists.txt
Normal file
@ -0,0 +1,6 @@
|
||||
include_directories( ${CMAKE_CURRENT_BINARY_DIR}/.. ${CMAKE_CURRENT_SOURCE_DIR}/.. )
|
||||
|
||||
add_llvm_library(LLVMARMAsmParser
|
||||
ARMAsmParser.cpp
|
||||
)
|
||||
add_dependencies(LLVMARMAsmParser)
|
15
lib/Target/ARM/AsmParser/Makefile
Normal file
15
lib/Target/ARM/AsmParser/Makefile
Normal file
@ -0,0 +1,15 @@
|
||||
##===- lib/Target/ARM/AsmParser/Makefile -------------------*- Makefile -*-===##
|
||||
#
|
||||
# The LLVM Compiler Infrastructure
|
||||
#
|
||||
# This file is distributed under the University of Illinois Open Source
|
||||
# License. See LICENSE.TXT for details.
|
||||
#
|
||||
##===----------------------------------------------------------------------===##
|
||||
LEVEL = ../../../..
|
||||
LIBRARYNAME = LLVMARMAsmParser
|
||||
|
||||
# Hack: we need to include 'main' ARM target directory to grab private headers
|
||||
CPPFLAGS = -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/..
|
||||
|
||||
include $(LEVEL)/Makefile.common
|
@ -18,6 +18,6 @@ BUILT_SOURCES = ARMGenRegisterInfo.h.inc ARMGenRegisterNames.inc \
|
||||
ARMGenDAGISel.inc ARMGenSubtarget.inc \
|
||||
ARMGenCodeEmitter.inc ARMGenCallingConv.inc
|
||||
|
||||
DIRS = AsmPrinter TargetInfo
|
||||
DIRS = AsmPrinter AsmParser TargetInfo
|
||||
|
||||
include $(LEVEL)/Makefile.common
|
||||
|
6
test/MC/AsmParser/arm_word_directive.s
Normal file
6
test/MC/AsmParser/arm_word_directive.s
Normal file
@ -0,0 +1,6 @@
|
||||
@ RUN: llvm-mc -triple arm-unknown-unknown %s | FileCheck %s
|
||||
|
||||
@ CHECK: TEST0:
|
||||
@ CHECK: .long 3
|
||||
TEST0:
|
||||
.word 3
|
@ -19,8 +19,3 @@ TEST2:
|
||||
# CHECK: .quad 9
|
||||
TEST3:
|
||||
.quad 9
|
||||
|
||||
# CHECK: TEST4:
|
||||
# CHECK: .short 3
|
||||
TEST4:
|
||||
.word 3
|
||||
|
6
test/MC/AsmParser/x86_word_directive.s
Normal file
6
test/MC/AsmParser/x86_word_directive.s
Normal file
@ -0,0 +1,6 @@
|
||||
# RUN: llvm-mc -triple i386-unknown-unknown %s | FileCheck %s
|
||||
|
||||
# CHECK: TEST0:
|
||||
# CHECK: .short 3
|
||||
TEST0:
|
||||
.word 3
|
Loading…
Reference in New Issue
Block a user