mirror of
https://github.com/capstone-engine/capstone.git
synced 2026-10-12 02:11:43 +00:00
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:
+32
-2
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user