Skip to content

Commit 38a593f

Browse files
authored
If perl isn't found, use pregenerated files (#53)
If perl isn't found, use pregenerated files
1 parent 228ca99 commit 38a593f

29 files changed

+71936
-31
lines changed

CMakeLists.txt

+51-13
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.5)
33
# The directory label is used for CDash to treat DILL as a subproject of GTKorvo
44
set(CMAKE_DIRECTORY_LABELS DILL)
55

6-
project(DILL VERSION 3.1.0 LANGUAGES C CXX)
6+
project(DILL VERSION 3.1.1 LANGUAGES C CXX)
77

88
# Some boilerplate to setup nice output directories
99
include(GNUInstallDirs)
@@ -88,6 +88,7 @@ set(SRC_list
8888
dill_virtual.c
8989
virtual.c
9090
dill.c
91+
dill.h
9192
vm.c
9293
x86_64_disassembler.c
9394
)
@@ -267,29 +268,65 @@ else()
267268
set(EMULATION_POSSIBLE FALSE)
268269
endif()
269270

270-
find_package(Perl REQUIRED)
271-
272271
option(DILL_ENABLE_DISASSEMBLY
273272
"enable binutils-based disassembly (default is OFF)" OFF)
274273

274+
find_package(Perl)
275+
275276
set(ARCHITECTURES sparc ppc64le virtual x86 x86_64 ia64 arm5 arm6 arm8)
276277
foreach(_arch ${ARCHITECTURES})
277-
add_custom_command(
278-
OUTPUT dill_${_arch}.c
279-
COMMAND ${PERL_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/${_arch}.ops
280-
DEPENDS ${_arch}.ops
281-
)
278+
if(PERL_FOUND)
279+
if(_arch STREQUAL "virtual")
280+
add_custom_command(
281+
OUTPUT dill_${_arch}.c vm_include.c
282+
COMMAND ${PERL_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/${_arch}.ops
283+
DEPENDS ${_arch}.ops
284+
)
285+
else()
286+
add_custom_command(
287+
OUTPUT dill_${_arch}.c
288+
COMMAND ${PERL_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/${_arch}.ops
289+
DEPENDS ${_arch}.ops
290+
)
291+
endif()
292+
else()
293+
add_custom_command(OUTPUT dill_${_arch}.c
294+
COMMAND ${CMAKE_COMMAND} -E copy
295+
${PROJECT_SOURCE_DIR}/pregen-source/dill_${_arch}.c dill_${_arch}.c
296+
COMMENT "Copying pregen diil_${_arch}.c build area")
297+
if(_arch STREQUAL "virtual")
298+
add_custom_command(OUTPUT vm_include.c
299+
COMMAND ${CMAKE_COMMAND} -E copy
300+
${PROJECT_SOURCE_DIR}/pregen-source/vm_include.c vm_include.c
301+
COMMENT "Copying pregen vm_include.c build area")
302+
endif()
303+
endif()
282304
list(APPEND arch_files dill_${_arch}.c ${_arch}.c)
283305
if(NOT _arch STREQUAL "virtual")
284306
list(APPEND arch_files ${_arch}_rt.c)
307+
else()
308+
add_custom_target(generate_vm_include DEPENDS vm_include.c)
285309
endif()
286310
endforeach()
287311

288-
add_custom_command(
289-
OUTPUT dill.h dill.c
290-
COMMAND ${PERL_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/base.ops ${BASE_OPS_ARG}
291-
DEPENDS base.ops
292-
)
312+
if (PERL_FOUND)
313+
add_custom_command(
314+
OUTPUT dill.h dill.c
315+
COMMAND ${PERL_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/base.ops ${BASE_OPS_ARG}
316+
DEPENDS base.ops
317+
)
318+
else()
319+
string(MAKE_C_IDENTIFIER "${BASE_OPS_ARG}" FLAGS_STR)
320+
add_custom_command(OUTPUT dill.c
321+
COMMAND ${CMAKE_COMMAND} -E copy
322+
${PROJECT_SOURCE_DIR}/pregen-source/dill${FLAGS_STR}.c dill.c
323+
COMMENT "Copying pregen diil.c build area")
324+
add_custom_command(OUTPUT dill.h
325+
COMMAND ${CMAKE_COMMAND} -E copy
326+
${PROJECT_SOURCE_DIR}/pregen-source/dill${FLAGS_STR}.h dill.h
327+
COMMENT "Copying pregen diil.h build area")
328+
329+
endif()
293330

294331
option(DILL_MULTI_TARGET "Build all available target architectures" OFF)
295332

@@ -388,6 +425,7 @@ set(DILL_LIBRARY_PREFIX "" CACHE STRING
388425
mark_as_advanced(DILL_LIBRARY_PREFIX)
389426

390427
add_library(dill ${SRC_list})
428+
add_dependencies(dill generate_vm_include)
391429
set_target_properties(dill PROPERTIES
392430
OUTPUT_NAME ${DILL_LIBRARY_PREFIX}dill
393431
VERSION ${DILL_VERSION}

pregen-source/dill.c

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
char *branch_op_names[] = {"eqc", "equc", "eqs", "equs", "eqi", "equ", "eql", "equl", "eqp", "eqf", "eqd", "gec", "geuc", "ges", "geus", "gei", "geu", "gel", "geul", "gep", "gef", "ged", "gtc", "gtuc", "gts", "gtus", "gti", "gtu", "gtl", "gtul", "gtp", "gtf", "gtd", "lec", "leuc", "les", "leus", "lei", "leu", "lel", "leul", "lep", "lef", "led", "ltc", "ltuc", "lts", "ltus", "lti", "ltu", "ltl", "ltul", "ltp", "ltf", "ltd", "nec", "neuc", "nes", "neus", "nei", "neu", "nel", "neul", "nep", "nef", "ned", 0};
2+
char *compare_op_names[] = {"eqc", "equc", "eqs", "equs", "eqi", "equ", "eql", "equl", "eqp", "eqf", "eqd", "gec", "geuc", "ges", "geus", "gei", "geu", "gel", "geul", "gep", "gef", "ged", "gtc", "gtuc", "gts", "gtus", "gti", "gtu", "gtl", "gtul", "gtp", "gtf", "gtd", "lec", "leuc", "les", "leus", "lei", "leu", "lel", "leul", "lep", "lef", "led", "ltc", "ltuc", "lts", "ltus", "lti", "ltu", "ltl", "ltul", "ltp", "ltf", "ltd", "nec", "neuc", "nes", "neus", "nei", "neu", "nel", "neul", "nep", "nef", "ned", 0};
3+
4+
/* This file is generated from base.ops. Do not edit directly. */
5+
6+
#include "dill.h"
7+
8+
char *arith3_name[] = {"addi", "addu", "addul", "addl", "subi", "subu", "subul", "subl", "muli", "mulu", "mulul", "mull", "divi", "divu", "divul", "divl", "modi", "modu", "modul", "modl", "xori", "xoru", "xorul", "xorl", "andi", "andu", "andul", "andl", "ori", "oru", "orul", "orl", "lshi", "lshu", "lshul", "lshl", "rshi", "rshu", "rshul", "rshl", "addp", "subp", "addf", "addd", "subf", "subd", "mulf", "muld", "divf", "divd"};
9+
10+
char *arith2_name[] = {"noti", "notu", "notul", "notl", "comi", "comu", "comul", "coml", "negi", "negu", "negul", "negl", "bswaps", "bswapus", "bswapi", "bswapu", "bswapul", "bswapl", "bswapf", "bswapd", "negf", "negd"};
11+
int dill_add_poly_map[] = {
12+
dill_jmp_addl, dill_jmp_addul, dill_jmp_addl, dill_jmp_addul, dill_jmp_addi, dill_jmp_addu, dill_jmp_addl, dill_jmp_addul, dill_jmp_addp, dill_jmp_addf, dill_jmp_addd, dill_jmp_addl, dill_jmp_addl, 0};
13+
int dill_and_poly_map[] = {
14+
dill_jmp_andl, dill_jmp_andul, dill_jmp_andl, dill_jmp_andul, dill_jmp_andi, dill_jmp_andu, dill_jmp_andl, dill_jmp_andul, dill_jmp_andl, dill_jmp_andl, dill_jmp_andl, dill_jmp_andl, dill_jmp_andl, 0};
15+
int dill_div_poly_map[] = {
16+
dill_jmp_divl, dill_jmp_divul, dill_jmp_divl, dill_jmp_divul, dill_jmp_divi, dill_jmp_divu, dill_jmp_divl, dill_jmp_divul, dill_jmp_divl, dill_jmp_divf, dill_jmp_divd, dill_jmp_divl, dill_jmp_divl, 0};
17+
int dill_lsh_poly_map[] = {
18+
dill_jmp_lshl, dill_jmp_lshul, dill_jmp_lshl, dill_jmp_lshul, dill_jmp_lshi, dill_jmp_lshu, dill_jmp_lshl, dill_jmp_lshul, dill_jmp_lshl, dill_jmp_lshl, dill_jmp_lshl, dill_jmp_lshl, dill_jmp_lshl, 0};
19+
int dill_mod_poly_map[] = {
20+
dill_jmp_modl, dill_jmp_modul, dill_jmp_modl, dill_jmp_modul, dill_jmp_modi, dill_jmp_modu, dill_jmp_modl, dill_jmp_modul, dill_jmp_modl, dill_jmp_modl, dill_jmp_modl, dill_jmp_modl, dill_jmp_modl, 0};
21+
int dill_mul_poly_map[] = {
22+
dill_jmp_mull, dill_jmp_mulul, dill_jmp_mull, dill_jmp_mulul, dill_jmp_muli, dill_jmp_mulu, dill_jmp_mull, dill_jmp_mulul, dill_jmp_mull, dill_jmp_mulf, dill_jmp_muld, dill_jmp_mull, dill_jmp_mull, 0};
23+
int dill_or_poly_map[] = {
24+
dill_jmp_orl, dill_jmp_orul, dill_jmp_orl, dill_jmp_orul, dill_jmp_ori, dill_jmp_oru, dill_jmp_orl, dill_jmp_orul, dill_jmp_orl, dill_jmp_orl, dill_jmp_orl, dill_jmp_orl, dill_jmp_orl, 0};
25+
int dill_rsh_poly_map[] = {
26+
dill_jmp_rshl, dill_jmp_rshul, dill_jmp_rshl, dill_jmp_rshul, dill_jmp_rshi, dill_jmp_rshu, dill_jmp_rshl, dill_jmp_rshul, dill_jmp_rshl, dill_jmp_rshl, dill_jmp_rshl, dill_jmp_rshl, dill_jmp_rshl, 0};
27+
int dill_sub_poly_map[] = {
28+
dill_jmp_subl, dill_jmp_subul, dill_jmp_subl, dill_jmp_subul, dill_jmp_subi, dill_jmp_subu, dill_jmp_subl, dill_jmp_subul, dill_jmp_subp, dill_jmp_subf, dill_jmp_subd, dill_jmp_subl, dill_jmp_subl, 0};
29+
int dill_xor_poly_map[] = {
30+
dill_jmp_xorl, dill_jmp_xorul, dill_jmp_xorl, dill_jmp_xorul, dill_jmp_xori, dill_jmp_xoru, dill_jmp_xorl, dill_jmp_xorul, dill_jmp_xorl, dill_jmp_xorl, dill_jmp_xorl, dill_jmp_xorl, dill_jmp_xorl, 0};
31+
char *dill_type_names[] = {
32+
"c", /* char */
33+
"uc", /* unsigned char */
34+
"s", /* short */
35+
"us", /* unsigned short */
36+
"i", /* int */
37+
"u", /* unsigned */
38+
"l", /* long (full register size) */
39+
"ul", /* unsigned long (full register size) */
40+
"p", /* pointer */
41+
"f", /* floating */
42+
"d", /* double */
43+
"v", /* void */
44+
"b", /* block structure */
45+
};

0 commit comments

Comments
 (0)