我正在尝试根据LLVM的Test Suite Guide使用llvm testsuite运行SPEC2017基准测试。我的cmake命令成功执行,但是使用make时,在诸如numeric_traits.h之类的包含文件中出现错误。我在 #include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *ltrim(char *s) {
while (*s == ' ' || *s == '\t') s++;
return s;
}
char getRegister(char *text) {
if (*text == 'r' || *text=='R') text++;
return atoi(text);
}
char getHex(char *text){
int number = (int)strtol(text, NULL, 16);
char reservednum[5];
if(number <= 0xFFFF){
sprintf(&reservednum[0], "%04x", number);
}
return atoi(reservednum);
}
int assembleLine(char *text, unsigned char* bytes) {
text = ltrim(text);
char *keyWord = strtok(text," ");
if (strcmp("add",keyWord) == 0) {
bytes[0] = 0x10;
bytes[0] |= getRegister(strtok(NULL," "));
bytes[1] = getRegister(strtok(NULL," ")) << 4 | getRegister(strtok(NULL," "));
return 2;
}
else if(strcmp("subtract", keyWord) == 0){
bytes[0] = 0x50;
bytes[0] |= getRegister(strtok(NULL, " "));
bytes[1] = getRegister(strtok(NULL, " ")) << 4 | getRegister(strtok(NULL, " "));
return 2;
}
else if(strcmp("and", keyWord) == 0){
bytes[0] = 0x20;
bytes[0] |= getRegister(strtok(NULL, " "));
bytes[1] = getRegister(strtok(NULL, " ")) << 4 | getRegister(strtok(NULL, " "));
return 2;
}
else if(strcmp("divide", keyWord) == 0){
bytes[0] = 0x30;
bytes[0] |= getRegister(strtok(NULL, " "));
bytes[1] = getRegister(strtok(NULL, " ")) << 4 | getRegister(strtok(NULL, " "));
return 2;
}
else if(strcmp("multiply", keyWord) == 0){
bytes[0] = 0x40;
bytes[0] |= getRegister(strtok(NULL, " "));
bytes[1] = getRegister(strtok(NULL, " ")) << 4 | getRegister(strtok(NULL, " "));
return 2;
}
else if(strcmp("or", keyWord) == 0){
bytes[0] = 0x60;
bytes[0] |= getRegister(strtok(NULL, " "));
bytes[1] = getRegister(strtok(NULL, " ")) << 4 | getRegister(strtok(NULL, " "));
return 2;
}
else if(strcmp("halt", keyWord) == 0){
bytes[0] = 0x00;
bytes[1] = 0x00;
return 2;
}
else if(strcmp("return", keyWord) == 0){
bytes[0] = 0x70;
bytes[1] = 0x00;
return 2;
}
else if(strcmp("addimmediate", keyWord) == 0){
bytes[0] = 0x90;
bytes[0] |= getRegister(strtok(NULL, " "));
bytes[1] = getHex(strtok(NULL, " "));
return 2;
}
else if(strcmp("interrupt", keyWord) == 0){
bytes[0] = 0x80;
bytes[0] |= getHex(strtok(NULL, " "));
bytes[1] = 0x00;
return 2;
}
else if(strcmp("push", keyWord) == 0){
bytes[0] = 0x70;
bytes[0] |= getRegister(strtok(NULL, " "));
bytes[1] = 0x40;
return 2;
}
else if(strcmp("pop", keyWord) == 0){
bytes[0] = 0x70;
bytes[0] |= getRegister(strtok(NULL, " "));
bytes[1] = 0x80;
return 2;
}
else if(strcmp("jump", keyWord) == 0){
bytes[0] = 0xC0;
bytes[1] = 0x00;
bytes[2] = 0x00;
bytes[3] = getHex(strtok(NULL, " "));
return 4;
}
else if(strcmp("branchifequal", keyWord) == 0){
bytes[0] = 0xA0;
bytes[0] |= getRegister(strtok(NULL, " "));
bytes[1] = getRegister(strtok(NULL, " ")) << 4;
bytes[2] = 0x00;
bytes[3] = getHex(strtok(NULL, " "));
return 4;
}
}
int main(int argc, char **argv) {
FILE *src = fopen(argv[1],"r");
FILE *dst = fopen(argv[2],"w");
while (!feof(src)) {
unsigned char bytes[4];
char line[1000];
if (NULL != fgets(line, 1000, src)) {
printf ("read: %s\n",line);
int byteCount = assembleLine(line,bytes);
fwrite(bytes,byteCount,1,dst);
}
}
fclose(src);
fclose(dst);
return 0;
}
和__is_signal
中每次出现numeric_traits.h
时都会收到错误。
CMake命令:
stl_algobase.h
设置:
答案 0 :(得分:0)
将其放入CXX https://www.spec.org/cpu2017/Docs/benchmarks/flags/526.blender_r.flags.html#b526.blender_r_D__BOOL_DEFINED的可移植性标志
FYI,<SPEC_SRC>/config/Example-clang-llvm-linux-x86.cfg
或<SPEC_SRC>/config/Example-aocc-linux-x86.cfg
包含特定于Clang的可移植性标志。