add riscv cmake support & using static array contain temp string for riscv (#1435)

* add TableGen patch whcih fix riscv asmwrter.inc memory leak

* add riscv for cmake suporrt and change asmwriter using static array container

* add missing .inc files for riscv cmake support
This commit is contained in:
z
2019-03-20 23:19:26 +08:00
committed by Nguyen Anh Quynh
parent 4a6b4ba66f
commit 0664b4b774
3 changed files with 100 additions and 5 deletions
+32 -2
View File
@@ -28,8 +28,8 @@ option(CAPSTONE_BUILD_TESTS "Build tests" ON)
option(CAPSTONE_BUILD_CSTOOL "Build cstool" ON)
option(CAPSTONE_USE_DEFAULT_ALLOC "Use default memory allocation functions" ON)
set(SUPPORTED_ARCHITECTURES ARM ARM64 M68K MIPS PPC SPARC SYSZ XCORE X86 TMS320C64X M680X EVM MOS65XX WASM BPF)
set(SUPPORTED_ARCHITECTURE_LABELS ARM ARM64 M68K MIPS PowerPC Sparc SystemZ XCore x86 TMS320C64x M680x EVM MOS65XX WASM BPF)
set(SUPPORTED_ARCHITECTURES ARM ARM64 M68K MIPS PPC SPARC SYSZ XCORE X86 TMS320C64X M680X EVM MOS65XX WASM BPF RISCV)
set(SUPPORTED_ARCHITECTURE_LABELS ARM ARM64 M68K MIPS PowerPC Sparc SystemZ XCore x86 TMS320C64x M680x EVM MOS65XX WASM BPF RISCV)
list(LENGTH SUPPORTED_ARCHITECTURES count)
math(EXPR count "${count}-1")
@@ -116,6 +116,7 @@ set(HEADERS_COMMON
include/capstone/m680x.h
include/capstone/mos65xx.h
include/capstone/bpf.h
include/capstone/riscv.h
include/capstone/platform.h
)
@@ -487,6 +488,31 @@ if (NOT CAPSTONE_X86_ONLY AND CAPSTONE_BPF_SUPPORT)
set(TEST_SOURCES ${TEST_SOURCES} test_bpf.c)
endif ()
if (NOT CAPSTONE_X86_ONLY AND CAPSTONE_RISCV_SUPPORT)
add_definitions(-DCAPSTONE_HAS_RISCV)
set(SOURCES_RISCV
arch/RISCV/RISCVDisassembler.c
arch/RISCV/RISCVInstPrinter.c
arch/RISCV/RISCVMapping.c
arch/RISCV/RISCVModule.c
)
set(HEADERS_RISCV
arch/RISCV/RISCVBaseInfo.h
arch/RISCV/RISCVDisassembler.h
arch/RISCV/RISCVInstPrinter.h
arch/RISCV/RISCVMapping.h
arch/RISCV/RISCVModule.h
arch/RISCV/RISCVGenAsmWriter.inc
arch/RISCV/RISCVGenDisassemblerTables.inc
arch/RISCV/RISCVGenInsnNameMaps.inc
arch/RISCV/RISCVGenInstrInfo.inc
arch/RISCV/RISCVGenRegisterInfo.inc
arch/RISCV/RISCVGenSubtargetInfo.inc
arch/RISCV/RISCVMappingInsn.inc
)
set(TEST_SOURCES ${TEST_SOURCES} test_riscv.c)
endif ()
if (CAPSTONE_OSXKERNEL_SUPPORT)
add_definitions(-DCAPSTONE_HAS_OSXKERNEL)
endif ()
@@ -508,6 +534,7 @@ set(ALL_SOURCES
${SOURCES_WASM}
${SOURCES_MOS65XX}
${SOURCES_BPF}
${SOURCES_RISCV}
)
set(ALL_HEADERS
@@ -528,6 +555,7 @@ set(ALL_HEADERS
${HEADERS_WASM}
${HEADERS_MOS65XX}
${HEADERS_BPF}
${HEADERS_RISCV}
)
include_directories("${PROJECT_SOURCE_DIR}/include")
@@ -611,6 +639,7 @@ source_group("Source\\EVM" FILES ${SOURCES_EVM})
source_group("Source\\WASM" FILES ${SOURCES_WASM})
source_group("Source\\MOS65XX" FILES ${SOURCES_MOS65XX})
source_group("Source\\BPF" FILES ${SOURCES_BPF})
source_group("Source\\RISCV" FILES ${SOURCES_RISCV})
source_group("Include\\Common" FILES ${HEADERS_COMMON})
source_group("Include\\Engine" FILES ${HEADERS_ENGINE})
@@ -629,6 +658,7 @@ source_group("Include\\EVM" FILES ${HEADERS_EVM})
source_group("Include\\WASM" FILES ${HEADERS_WASM})
source_group("Include\\MOS65XX" FILES ${HEADERS_MOS65XX})
source_group("Include\\BPF" FILES ${HEADERS_BPF})
source_group("Include\\RISCV" FILES ${HEADERS_RISCV})
### test library 64bit routine:
include("GNUInstallDirs")
+15 -3
View File
@@ -1494,7 +1494,10 @@ static bool printAliasInstr(MCInst *MI, SStream * OS, void *info)
MCRegisterInfo *MRI = (MCRegisterInfo *) info;
const char *AsmString;
unsigned I = 0;
char *tmpString;
#define ASMSTRING_CONTAIN_SIZE 64
unsigned AsmStringLen = 0;
char tmpString_[ASMSTRING_CONTAIN_SIZE];
char *tmpString = tmpString_;
switch (MCInst_getOpcode(MI)) {
default: return false;
case RISCV_ADDI:
@@ -2559,13 +2562,22 @@ static bool printAliasInstr(MCInst *MI, SStream * OS, void *info)
return false;
}
tmpString = cs_strdup(AsmString);
AsmStringLen = strlen(AsmString);
if (ASMSTRING_CONTAIN_SIZE - 1 < AsmStringLen)
tmpString = cs_strdup(AsmString);
else
tmpString = memcpy(tmpString, AsmString, 1 + AsmStringLen);
while (AsmString[I] != ' ' && AsmString[I] != '\t' &&
AsmString[I] != '$' && AsmString[I] != '\0')
++I;
tmpString[I] = 0;
SStream_concat0(OS, tmpString);
cs_mem_free(tmpString);
if (ASMSTRING_CONTAIN_SIZE - 1 < AsmStringLen)
/* Free the possible cs_strdup() memory. PR#1424. */
cs_mem_free(tmpString);
#undef ASMSTRING_CONTAIN_SIZE
if (AsmString[I] != '\0') {
if (AsmString[I] == ' ' || AsmString[I] == '\t') {
SStream_concat0(OS, " ");
@@ -0,0 +1,53 @@
From 93d420c95c3cf1d6a369be1ca7f2333fdf670283 Mon Sep 17 00:00:00 2001
From: fanfuqiang <[email protected]>
Date: Wed, 20 Mar 2019 15:15:01 +0800
Subject: [PATCH] using static array contain temp string for riscv asmwriter
---
llvm/utils/TableGen/AsmWriterEmitter.cpp | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/llvm/utils/TableGen/AsmWriterEmitter.cpp b/llvm/utils/TableGen/AsmWriterEmitter.cpp
index bc32a494b..8e2bd70c6 100644
--- a/llvm/utils/TableGen/AsmWriterEmitter.cpp
+++ b/llvm/utils/TableGen/AsmWriterEmitter.cpp
@@ -1171,7 +1171,10 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
O.indent(2) << "const char *AsmString;\n";
#ifdef CAPSTONE
O << " unsigned I = 0;\n";
- O << " char *tmpString;\n";
+ O << "#define ASMSTRING_CONTAIN_SIZE 64\n";
+ O << " unsigned AsmStringLen = 0;\n";
+ O << " char tmpString_[ASMSTRING_CONTAIN_SIZE];\n";
+ O << " char *tmpString = tmpString_;\n";
O.indent(2) << "switch (MCInst_getOpcode(MI)) {\n";
#else
O.indent(2) << "switch (MI->getOpcode()) {\n";
@@ -1186,7 +1189,11 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
O << " unsigned I = 0;\n";
#endif
#ifdef CAPSTONE
- O << " tmpString = cs_strdup(AsmString);\n";
+ O << " AsmStringLen = strlen(AsmString);\n";
+ O << " if (ASMSTRING_CONTAIN_SIZE - 1 < AsmStringLen)\n";
+ O << " tmpString = cs_strdup(AsmString);\n";
+ O << " else\n";
+ O << " tmpString = memcpy(tmpString, AsmString, 1 + AsmStringLen);\n\n";
#endif
O << " while (AsmString[I] != ' ' && AsmString[I] != '\\t' &&\n";
O << " AsmString[I] != '$' && AsmString[I] != '\\0')\n";
@@ -1194,7 +1201,10 @@ void AsmWriterEmitter::EmitPrintAliasInstruction(raw_ostream &O) {
#ifdef CAPSTONE
O << " tmpString[I] = 0;\n";
O << " SStream_concat0(OS, tmpString);\n";
- O << " cs_mem_free(tmpString);\n";
+ O << " if (ASMSTRING_CONTAIN_SIZE - 1 < AsmStringLen)\n";
+ O << " /* Free the possible cs_strdup() memory. PR#1424. */\n";
+ O << " cs_mem_free(tmpString);\n";
+ O << "#undef ASMSTRING_CONTAIN_SIZE\n\n";
#else
O << " OS << '\\t' << StringRef(AsmString, I);\n";
#endif
--
2.20.1