in vm/jitrino/src/codegenerator/ia32/Ia32InternalProfiler.cpp [254:522]
void InternalProfilerAct::readConfig(Config * config) {
std::string configString;
std::ifstream configFile;
const char* fname;
if ((fname = getArg("config")) == 0)
fname = "iprof.cfg";
configFile.open(fname, std::ios::in);
bool rc = false;
if (configFile.is_open()) {
std::string line;
U_32 ln = 0;
bool opened = false;
int num = -1;
while (std::getline(configFile, line)) {
ln++;
if(!line.empty() && (line.find("#")!= 0)) {
const char * c_line = line.c_str();
if(std::strstr(c_line, "Config") == c_line) {
if(((int)line.find("PrintBBStats") != -1) && ((int)line.find("true")!=-1))
config->printBBStats = true;
} else if (line.find("Counter.") == 0) {
if(!opened) {
opened = true;
num = (int)config->counters.size();
config->counters.push_back(Counter());
int pos1 = (int)line.find(".");
int pos2 = (int)line.find_first_of(".=" , pos1+1);
config->counters[num].name = line.substr(pos1+1, pos2-pos1-1);
}
if((int)line.find(".Title=")!=-1) {
char * val = (char *)std::strstr(line.c_str(),"=")+1;
config->counters[num].title=std::string(val);
} else if (((int)line.find(".IsOR=")!=-1) && ((int)line.find("true")!=-1)) {
config->counters[num].filter.isOR=true;
} else if ((int)line.find(std::string(config->counters[num].name)+"=")!=-1) {
char * val = (char *)std::strstr(line.c_str(),"=")+1;
for(U_32 i = 0; i < config->counters.size(); i++) {
if(std::string(config->counters[i].name) == val) {
config->counters[num].filter = config->counters[i].filter;
break;
}
}
} else if((int)line.find(".Mnemonic")!=-1) {
char * mnem = (char *)std::strstr(line.c_str(),"=")+1;
if ((std::string(mnem) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
config->counters[num].filter.mnemonic.isNegative=true;
} else {
config->counters[num].filter.isInitialized=true;
config->counters[num].filter.mnemonic.value=EncoderBase::str2mnemonic(mnem);
config->counters[num].filter.mnemonic.isInitialized=true;
}
} else if (std::strstr(line.c_str(), ".OpndNumber")) {
char * val = (char *)std::strstr(line.c_str(),"=")+1;
if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
config->counters[num].filter.operandNumber.isNegative=true;
} else {
config->counters[num].filter.isInitialized=true;
config->counters[num].filter.operandNumber.value=atoi(val);
config->counters[num].filter.operandNumber.isInitialized=true;
}
} else if ((int)line.find(".Operand.") != -1) {
char * val = (char *)std::strstr(line.c_str(),"=")+1;
int pos = int(line.find(".Operand.")+9);
std::string v = line.substr(pos, line.find_first_of(".", pos)-pos);
int opNum;
if(v == "*")
opNum = -1;
else
opNum = atoi(v.c_str());
config->counters[num].filter.operandFilters[opNum].opNum = opNum;
config->counters[num].filter.operandFilters[opNum].isInitialized = true;
if ((int)line.find(".OpndRole") != -1) {
if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
config->counters[num].filter.operandFilters[opNum].opndRole.isNegative=true;
} else {
config->counters[num].filter.isInitialized=true;
config->counters[num].filter.operandFilters[opNum].opndRole.isInitialized=true;
for (U_32 i = 0; i<lengthof(opndRoles); i++) {
if(std::string(opndRoles[i].name) == val)
config->counters[num].filter.operandFilters[opNum].opndRole.value=opndRoles[i].value;
}
}
} else if ((int)line.find(".OpndKind") != -1) {
if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
config->counters[num].filter.operandFilters[opNum].opndKind.isNegative=true;
} else {
config->counters[num].filter.isInitialized=true;
config->counters[num].filter.operandFilters[opNum].opndKind.isInitialized=true;
config->counters[num].filter.operandFilters[opNum].opndKind.value=getOpndKind(val);
}
} else if ((int)line.find(".RegName") != -1) {
if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
config->counters[num].filter.operandFilters[opNum].opndRole.isNegative=true;
} else {
config->counters[num].filter.isInitialized=true;
config->counters[num].filter.operandFilters[opNum].regName.isInitialized=true;
config->counters[num].filter.operandFilters[opNum].regName.value = getRegName(val);
}
} else if ((int)line.find(".MemOpndKind") != -1) {
if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
config->counters[num].filter.operandFilters[opNum].memOpndKind.isNegative=true;
} else {
config->counters[num].filter.isInitialized=true;
config->counters[num].filter.operandFilters[opNum].memOpndKind.isInitialized=true;
for (U_32 i = 0; i<lengthof(memOpndKinds); i++) {
if(std::string(memOpndKinds[i].name) == val)
config->counters[num].filter.operandFilters[opNum].memOpndKind.value=memOpndKinds[i].value;
}
}
}
} else if ((int)line.find(".RuntimeInfo.Kind") != -1) {
char * val = (char *)std::strstr(line.c_str(),"=")+1;
if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
config->counters[num].filter.rtKind.isNegative=true;
} else {
config->counters[num].filter.isInitialized=true;
for (U_32 i = 0; i<lengthof(rtKinds); i++) {
if(std::string(rtKinds[i].name) == val)
config->counters[num].filter.rtKind.value=rtKinds[i].value;
}
//CompilationInterface::str2rid(val);
config->counters[num].filter.rtKind.isInitialized=true;
}
} else if ((int)line.find(".RuntimeInfo.HelperID") != -1) {
char * val = (char *)std::strstr(line.c_str(),"=")+1;
if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
config->counters[num].filter.rtHelperID.isNegative=true;
} else {
config->counters[num].filter.isInitialized=true;
config->counters[num].filter.rtHelperID.value=CompilationInterface::str2rid(val);
config->counters[num].filter.rtHelperID.isInitialized=true;
}
} else if ((int)line.find(".RuntimeInfo.IntHelperName") != -1) {
char * val = (char *)std::strstr(line.c_str(),"=")+1;
if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
config->counters[num].filter.rtIntHelperName.isNegative=true;
} else {
config->counters[num].filter.isInitialized=true;
config->counters[num].filter.rtIntHelperName.value=std::string(val);
config->counters[num].filter.rtIntHelperName.isInitialized=true;
}
} else if ((int)line.find(".isNative") != -1) {
char * val = (char *)std::strstr(line.c_str(),"=")+1;
if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
config->counters[num].filter.isNative.isNegative=true;
} else {
config->counters[num].filter.isInitialized=true;
config->counters[num].filter.isNative.value=(std::string(val) == "true")? true : false;
config->counters[num].filter.isNative.isInitialized=true;
}
} else if ((int)line.find(".isStatic") != -1) {
char * val = (char *)std::strstr(line.c_str(),"=")+1;
if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
config->counters[num].filter.isStatic.isNegative=true;
} else {
config->counters[num].filter.isInitialized=true;
config->counters[num].filter.isStatic.value=(std::string(val) == "true")? true : false;
config->counters[num].filter.isStatic.isInitialized=true;
}
} else if ((int)line.find(".isSynchronized") != -1) {
char * val = (char *)std::strstr(line.c_str(),"=")+1;
if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
config->counters[num].filter.isSynchronized.isNegative=true;
} else {
config->counters[num].filter.isInitialized=true;
config->counters[num].filter.isSynchronized.value=(std::string(val) == "true")? true : false;
config->counters[num].filter.isSynchronized.isInitialized=true;
}
} else if ((int)line.find(".isNoInlining") != -1) {
char * val = (char *)std::strstr(line.c_str(),"=")+1;
if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
config->counters[num].filter.isNoInlining.isNegative=true;
} else {
config->counters[num].filter.isInitialized=true;
config->counters[num].filter.isNoInlining.value=(std::string(val) == "true")? true : false;
config->counters[num].filter.isNoInlining.isInitialized=true;
}
} else if ((int)line.find(".isInstance") != -1) {
char * val = (char *)std::strstr(line.c_str(),"=")+1;
if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
config->counters[num].filter.isInstance.isNegative=true;
} else {
config->counters[num].filter.isInitialized=true;
config->counters[num].filter.isInstance.value=(std::string(val) == "true")? true : false;
config->counters[num].filter.isInstance.isInitialized=true;
}
} else if ((int)line.find(".isFinal") != -1) {
char * val = (char *)std::strstr(line.c_str(),"=")+1;
if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
config->counters[num].filter.isFinal.isNegative=true;
} else {
config->counters[num].filter.isInitialized=true;
config->counters[num].filter.isFinal.value=(std::string(val) == "true")? true : false;
config->counters[num].filter.isFinal.isInitialized=true;
}
} else if ((int)line.find(".isVirtual") != -1) {
char * val = (char *)std::strstr(line.c_str(),"=")+1;
if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
config->counters[num].filter.isVirtual.isNegative=true;
} else {
config->counters[num].filter.isInitialized=true;
config->counters[num].filter.isVirtual.value=(std::string(val) == "true")? true : false;
config->counters[num].filter.isVirtual.isInitialized=true;
}
} else if ((int)line.find(".isAbstract") != -1) {
char * val = (char *)std::strstr(line.c_str(),"=")+1;
if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
config->counters[num].filter.isAbstract.isNegative=true;
} else {
config->counters[num].filter.isInitialized=true;
config->counters[num].filter.isAbstract.value=(std::string(val) == "true")? true : false;
config->counters[num].filter.isAbstract.isInitialized=true;
}
} else if ((int)line.find(".isClassInitializer") != -1) {
char * val = (char *)std::strstr(line.c_str(),"=")+1;
if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
config->counters[num].filter.isClassInitializer.isNegative=true;
} else {
config->counters[num].filter.isInitialized=true;
config->counters[num].filter.isClassInitializer.value=(std::string(val) == "true")? true : false;
config->counters[num].filter.isClassInitializer.isInitialized=true;
}
} else if ((int)line.find(".isInstanceInitializer") != -1) {
char * val = (char *)std::strstr(line.c_str(),"=")+1;
if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
config->counters[num].filter.isInstanceInitializer.isNegative=true;
} else {
config->counters[num].filter.isInitialized=true;
config->counters[num].filter.isInstanceInitializer.value=(std::string(val) == "true")? true : false;
config->counters[num].filter.isInstanceInitializer.isInitialized=true;
}
} else if ((int)line.find(".isStrict") != -1) {
char * val = (char *)std::strstr(line.c_str(),"=")+1;
if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
config->counters[num].filter.isStrict.isNegative=true;
} else {
config->counters[num].filter.isInitialized=true;
config->counters[num].filter.isStrict.value=(std::string(val) == "true")? true : false;
config->counters[num].filter.isStrict.isInitialized=true;
}
} else if ((int)line.find(".isInitLocals") != -1) {
char * val = (char *)std::strstr(line.c_str(),"=")+1;
if ((std::string(val) == "true") && (std::strstr(line.c_str(), "IsNegative"))) {
config->counters[num].filter.isInitLocals.isNegative=true;
} else {
config->counters[num].filter.isInitialized=true;
config->counters[num].filter.isInitLocals.value=(std::string(val) == "true")? true : false;
config->counters[num].filter.isInitLocals.isInitialized=true;
}
}
} else if (std::strstr(c_line, "[begin]") == c_line) {
} else if (std::strstr(c_line, "[end]") == c_line) {
opened = false;
} else if (std::strstr(c_line, "#") == c_line) {
} else {
::std::cerr<<"iprof: BAD LINE("<<ln<<") in configuration file"<<::std::endl;
exit(1);
}
configString+=line+"\n";
}
}
rc = !configString.empty();
}
if (!rc) {
::std::cerr<<"iprof: Can't read configuration"<<::std::endl;
}
}