forked from OSchip/llvm-project
Sketch support for target specific assembly parser.
- Not fully enabled yet, need a configure regeneration. llvm-svn: 76230
This commit is contained in:
parent
28309ac04c
commit
71475775b9
|
@ -257,6 +257,7 @@ add_subdirectory(lib/Analysis/IPA)
|
|||
add_subdirectory(lib/MC)
|
||||
|
||||
set(LLVM_ENUM_ASM_PRINTERS "")
|
||||
set(LLVM_ENUM_ASM_PARSERS "")
|
||||
foreach(t ${LLVM_TARGETS_TO_BUILD})
|
||||
message(STATUS "Targeting ${t}")
|
||||
add_subdirectory(lib/Target/${t})
|
||||
|
@ -266,6 +267,11 @@ add_subdirectory(lib/MC)
|
|||
set(LLVM_ENUM_ASM_PRINTERS
|
||||
"${LLVM_ENUM_ASM_PRINTERS}LLVM_ASM_PRINTER(${t})\n")
|
||||
endif( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/AsmPrinter/CMakeLists.txt )
|
||||
if( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/AsmParser/CMakeLists.txt )
|
||||
add_subdirectory(lib/Target/${t}/AsmParser)
|
||||
set(LLVM_ENUM_ASM_PARSERS
|
||||
"${LLVM_ENUM_ASM_PARSERS}LLVM_ASM_PARSER(${t})\n")
|
||||
endif( EXISTS ${LLVM_MAIN_SRC_DIR}/lib/Target/${t}/AsmParser/CMakeLists.txt )
|
||||
endforeach(t)
|
||||
|
||||
# Produce llvm/Config/AsmPrinters.def
|
||||
|
@ -274,6 +280,12 @@ configure_file(
|
|||
${LLVM_BINARY_DIR}/include/llvm/Config/AsmPrinters.def
|
||||
)
|
||||
|
||||
# Produce llvm/Config/AsmParsers.def
|
||||
configure_file(
|
||||
${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmParsers.def.in
|
||||
${LLVM_BINARY_DIR}/include/llvm/Config/AsmParsers.def
|
||||
)
|
||||
|
||||
add_subdirectory(lib/ExecutionEngine)
|
||||
add_subdirectory(lib/ExecutionEngine/Interpreter)
|
||||
add_subdirectory(lib/ExecutionEngine/JIT)
|
||||
|
|
|
@ -458,17 +458,22 @@ for a_target in $TARGETS_TO_BUILD; do
|
|||
done
|
||||
|
||||
# Build the LLVM_TARGET and LLVM_ASM_PRINTER macro uses for
|
||||
# Targets.def and AsmPrinters.def.
|
||||
# Targets.def, AsmPrinters.def, and AsmParsers.def.
|
||||
LLVM_ENUM_TARGETS=""
|
||||
LLVM_ENUM_ASM_PRINTERS=""
|
||||
LLVM_ENUM_ASM_PARSERS=""
|
||||
for target_to_build in $TARGETS_TO_BUILD; do
|
||||
LLVM_ENUM_TARGETS="LLVM_TARGET($target_to_build) $LLVM_ENUM_TARGETS"
|
||||
if test -f ${srcdir}/lib/Target/${target_to_build}/AsmPrinter/Makefile ; then
|
||||
LLVM_ENUM_ASM_PRINTERS="LLVM_ASM_PRINTER($target_to_build) $LLVM_ENUM_ASM_PRINTERS";
|
||||
fi
|
||||
if test -f ${srcdir}/lib/Target/${target_to_build}/AsmParser/Makefile ; then
|
||||
LLVM_ENUM_ASM_PARSERS="LLVM_ASM_PARSER($target_to_build) $LLVM_ENUM_ASM_PARSERS";
|
||||
fi
|
||||
done
|
||||
AC_SUBST(LLVM_ENUM_TARGETS)
|
||||
AC_SUBST(LLVM_ENUM_ASM_PRINTERS)
|
||||
AC_SUBST(LLVM_ENUM_ASM_PARSERS)
|
||||
|
||||
dnl Prevent the CBackend from using printf("%a") for floating point so older
|
||||
dnl C compilers that cannot deal with the 0x0p+0 hex floating point format
|
||||
|
@ -1257,6 +1262,7 @@ dnl files can be updated automatically when their *.in sources change.
|
|||
AC_CONFIG_HEADERS([include/llvm/Config/config.h])
|
||||
AC_CONFIG_FILES([include/llvm/Config/Targets.def])
|
||||
AC_CONFIG_FILES([include/llvm/Config/AsmPrinters.def])
|
||||
AC_CONFIG_FILES([include/llvm/Config/AsmParser.def])
|
||||
AC_CONFIG_HEADERS([include/llvm/Support/DataTypes.h])
|
||||
AC_CONFIG_HEADERS([include/llvm/ADT/iterator.h])
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@ endfunction(explicit_llvm_config)
|
|||
function(explicit_map_components_to_libraries out_libs)
|
||||
set( link_components ${ARGN} )
|
||||
foreach(c ${link_components})
|
||||
# add codegen/asmprinter
|
||||
# add codegen, asmprinter, asmparser
|
||||
list(FIND LLVM_TARGETS_TO_BUILD ${c} idx)
|
||||
if( NOT idx LESS 0 )
|
||||
list(FIND llvm_libs "LLVM${c}CodeGen" idx)
|
||||
|
@ -53,6 +53,10 @@ function(explicit_map_components_to_libraries out_libs)
|
|||
if( NOT asmidx LESS 0 )
|
||||
list(APPEND expanded_components "LLVM${c}AsmPrinter")
|
||||
endif()
|
||||
list(FIND llvm_libs "LLVM${c}AsmParser" asmidx)
|
||||
if( NOT asmidx LESS 0 )
|
||||
list(APPEND expanded_components "LLVM${c}AsmParser")
|
||||
endif()
|
||||
list(FIND llvm_libs "LLVM${c}Info" asmidx)
|
||||
if( NOT asmidx LESS 0 )
|
||||
list(APPEND expanded_components "LLVM${c}Info")
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
//===- llvm/Config/AsmParsers.def - LLVM Assembly Parsers -------*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file enumerates all of the assembly-language parsers
|
||||
// supported by this build of LLVM. Clients of this file should define
|
||||
// the LLVM_ASM_PARSER macro to be a function-like macro with a
|
||||
// single parameter (the name of the target whose assembly can be
|
||||
// generated); including this file will then enumerate all of the
|
||||
// targets with assembly parsers.
|
||||
//
|
||||
// The set of targets supported by LLVM is generated at configuration
|
||||
// time, at which point this header is generated. Do not modify this
|
||||
// header directly.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_ASM_PARSER
|
||||
# error Please define the macro LLVM_ASM_PARSER(TargetName)
|
||||
#endif
|
||||
|
||||
@LLVM_ENUM_ASM_PARSERS@
|
||||
|
||||
#undef LLVM_ASM_PARSER
|
|
@ -0,0 +1,34 @@
|
|||
//===-- llvm/Target/TargetAsmParser.h - Target Assembly Parser --*- C++ -*-===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_TARGET_TARGETPARSER_H
|
||||
#define LLVM_TARGET_TARGETPARSER_H
|
||||
|
||||
namespace llvm {
|
||||
class Target;
|
||||
|
||||
/// TargetAsmParser - Generic interface to target specific assembly parsers.
|
||||
class TargetAsmParser {
|
||||
TargetAsmParser(const TargetAsmParser &); // DO NOT IMPLEMENT
|
||||
void operator=(const TargetAsmParser &); // DO NOT IMPLEMENT
|
||||
protected: // Can only create subclasses.
|
||||
TargetAsmParser(const Target &);
|
||||
|
||||
/// TheTarget - The Target that this machine was created for.
|
||||
const Target &TheTarget;
|
||||
|
||||
public:
|
||||
virtual ~TargetAsmParser();
|
||||
|
||||
const Target &getTarget() const { return TheTarget; }
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
|
||||
#endif
|
|
@ -25,6 +25,7 @@
|
|||
namespace llvm {
|
||||
class FunctionPass;
|
||||
class Module;
|
||||
class TargetAsmParser;
|
||||
class TargetMachine;
|
||||
class formatted_raw_ostream;
|
||||
|
||||
|
@ -48,6 +49,7 @@ namespace llvm {
|
|||
typedef FunctionPass *(*AsmPrinterCtorTy)(formatted_raw_ostream &,
|
||||
TargetMachine &,
|
||||
bool);
|
||||
typedef TargetAsmParser *(*AsmParserCtorTy)(const Target &);
|
||||
|
||||
friend struct TargetRegistry;
|
||||
|
||||
|
@ -81,6 +83,10 @@ namespace llvm {
|
|||
/// if registered.
|
||||
AsmPrinterCtorTy AsmPrinterCtorFn;
|
||||
|
||||
/// AsmParserCtorFn - Construction function for this target's AsmParser,
|
||||
/// if registered.
|
||||
AsmParserCtorTy AsmParserCtorFn;
|
||||
|
||||
public:
|
||||
// getNext - Return the next registered target.
|
||||
const Target *getNext() const { return Next; }
|
||||
|
@ -101,6 +107,9 @@ namespace llvm {
|
|||
/// hasAsmPrinter - Check if this target supports .s printing.
|
||||
bool hasAsmPrinter() const { return AsmPrinterCtorFn != 0; }
|
||||
|
||||
/// hasAsmParser - Check if this target supports .s parsing.
|
||||
bool hasAsmParser() const { return AsmParserCtorFn != 0; }
|
||||
|
||||
/// createTargetMachine - Create a target specific machine implementation.
|
||||
TargetMachine *createTargetMachine(const Module &M,
|
||||
const std::string &Features) const {
|
||||
|
@ -117,6 +126,13 @@ namespace llvm {
|
|||
return 0;
|
||||
return AsmPrinterCtorFn(OS, M, Verbose);
|
||||
}
|
||||
|
||||
/// createAsmParser - Create a target specific assembly parser.
|
||||
TargetAsmParser *createAsmParser() const {
|
||||
if (!AsmParserCtorFn)
|
||||
return 0;
|
||||
return AsmParserCtorFn(*this);
|
||||
}
|
||||
};
|
||||
|
||||
/// TargetRegistry - Generic interface to target specific features.
|
||||
|
@ -225,8 +241,9 @@ namespace llvm {
|
|||
/// @param Fn - A function to construct a TargetMachine for the target.
|
||||
static void RegisterTargetMachine(Target &T,
|
||||
Target::TargetMachineCtorTy Fn) {
|
||||
assert(!T.TargetMachineCtorFn && "Constructor already registered!");
|
||||
T.TargetMachineCtorFn = Fn;
|
||||
// Ignore duplicate registration.
|
||||
if (!T.TargetMachineCtorFn)
|
||||
T.TargetMachineCtorFn = Fn;
|
||||
}
|
||||
|
||||
/// RegisterAsmPrinter - Register an AsmPrinter implementation for the given
|
||||
|
@ -239,8 +256,23 @@ namespace llvm {
|
|||
/// @param T - The target being registered.
|
||||
/// @param Fn - A function to construct an AsmPrinter for the target.
|
||||
static void RegisterAsmPrinter(Target &T, Target::AsmPrinterCtorTy Fn) {
|
||||
assert(!T.AsmPrinterCtorFn && "Constructor already registered!");
|
||||
T.AsmPrinterCtorFn = Fn;
|
||||
// Ignore duplicate registration.
|
||||
if (!T.AsmPrinterCtorFn)
|
||||
T.AsmPrinterCtorFn = Fn;
|
||||
}
|
||||
|
||||
/// RegisterAsmParser - Register a TargetAsmParser implementation for the
|
||||
/// given target.
|
||||
///
|
||||
/// Clients are responsible for ensuring that registration doesn't occur
|
||||
/// while another thread is attempting to access the registry. Typically
|
||||
/// this is done by initializing all targets at program startup.
|
||||
///
|
||||
/// @param T - The target being registered.
|
||||
/// @param Fn - A function to construct an AsmPrinter for the target.
|
||||
static void RegisterAsmParser(Target &T, Target::AsmParserCtorTy Fn) {
|
||||
if (!T.AsmParserCtorFn)
|
||||
T.AsmParserCtorFn = Fn;
|
||||
}
|
||||
|
||||
/// @}
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
include_directories( ${CMAKE_CURRENT_BINARY_DIR}/.. ${CMAKE_CURRENT_SOURCE_DIR}/.. )
|
||||
|
||||
add_llvm_library(LLVMX86AsmParser
|
||||
X86AsmParser.cpp
|
||||
)
|
||||
add_dependencies(LLVMX86AsmParser X86CodeGenTable_gen)
|
|
@ -0,0 +1,15 @@
|
|||
##===- lib/Target/X86/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 = LLVMX86AsmParser
|
||||
|
||||
# Hack: we need to include 'main' x86 target directory to grab private headers
|
||||
CPPFLAGS = -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/..
|
||||
|
||||
include $(LEVEL)/Makefile.common
|
|
@ -0,0 +1,40 @@
|
|||
//===-- X86AsmParser.cpp - Parse X86 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 "llvm/Target/TargetRegistry.h"
|
||||
#include "llvm/Target/TargetAsmParser.h"
|
||||
using namespace llvm;
|
||||
|
||||
namespace {
|
||||
|
||||
class X86ATTAsmParser : public TargetAsmParser {
|
||||
public:
|
||||
explicit X86ATTAsmParser(const Target &);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
X86ATTAsmParser::X86ATTAsmParser(const Target &T)
|
||||
: TargetAsmParser(T)
|
||||
{
|
||||
}
|
||||
|
||||
namespace {
|
||||
TargetAsmParser *createAsmParser(const Target &T) {
|
||||
return new X86ATTAsmParser(T);
|
||||
}
|
||||
}
|
||||
|
||||
// Force static initialization.
|
||||
extern "C" void LLVMInitializeX86AsmParser() {
|
||||
extern Target TheX86_32Target;
|
||||
TargetRegistry::RegisterAsmParser(TheX86_32Target, &createAsmParser);
|
||||
extern Target TheX86_64Target;
|
||||
TargetRegistry::RegisterAsmParser(TheX86_64Target, &createAsmParser);
|
||||
}
|
|
@ -18,6 +18,6 @@ BUILT_SOURCES = X86GenRegisterInfo.h.inc X86GenRegisterNames.inc \
|
|||
X86GenFastISel.inc \
|
||||
X86GenCallingConv.inc X86GenSubtarget.inc
|
||||
|
||||
DIRS = AsmPrinter TargetInfo
|
||||
DIRS = AsmPrinter AsmParser TargetInfo
|
||||
|
||||
include $(LEVEL)/Makefile.common
|
||||
|
|
|
@ -340,6 +340,11 @@ sub build_name_map {
|
|||
$NAME_MAP{$target} = [$target.'info',
|
||||
$NAME_MAP{$target}[0]]
|
||||
}
|
||||
|
||||
if (defined $NAME_MAP{$target.'asmparser'}) {
|
||||
$NAME_MAP{$target} = [$target.'asmparser',
|
||||
$NAME_MAP{$target}[0]]
|
||||
}
|
||||
}
|
||||
|
||||
# Add virtual entries.
|
||||
|
|
Loading…
Reference in New Issue