in rts/RtsFlags.c [1900:2015]
static bool read_heap_profiling_flag(const char *arg)
{
// Already parsed "-h"
bool error = false;
switch (arg[2]) {
case '\0':
case 'C':
case 'c':
case 'M':
case 'm':
case 'D':
case 'd':
case 'Y':
case 'y':
case 'R':
case 'r':
case 'B':
case 'b':
case 'T':
if (arg[2] != '\0' && arg[3] != '\0') {
{
const char *left = strchr(arg, '{');
const char *right = strrchr(arg, '}');
// curly braces are optional, for
// backwards compat.
if (left)
left = left+1;
else
left = arg + 3;
if (!right)
right = arg + strlen(arg);
char *selector = stgStrndup(left, right - left + 1);
switch (arg[2]) {
case 'c': // cost centre label select
RtsFlags.ProfFlags.ccSelector = selector;
break;
case 'C':
RtsFlags.ProfFlags.ccsSelector = selector;
break;
case 'M':
case 'm': // cost centre module select
RtsFlags.ProfFlags.modSelector = selector;
break;
case 'D':
case 'd': // closure descr select
RtsFlags.ProfFlags.descrSelector = selector;
break;
case 'Y':
case 'y': // closure type select
RtsFlags.ProfFlags.typeSelector = selector;
break;
case 'R':
case 'r': // retainer select
RtsFlags.ProfFlags.retainerSelector = selector;
break;
case 'B':
case 'b': // biography select
RtsFlags.ProfFlags.bioSelector = selector;
break;
default:
free(selector);
}
}
break;
}
if (RtsFlags.ProfFlags.doHeapProfile != 0) {
errorBelch("multiple heap profile options");
error = true;
break;
}
switch (arg[2]) {
case '\0':
case 'C':
case 'c':
RtsFlags.ProfFlags.doHeapProfile = HEAP_BY_CCS;
break;
case 'M':
case 'm':
RtsFlags.ProfFlags.doHeapProfile = HEAP_BY_MOD;
break;
case 'D':
case 'd':
RtsFlags.ProfFlags.doHeapProfile = HEAP_BY_DESCR;
break;
case 'Y':
case 'y':
RtsFlags.ProfFlags.doHeapProfile = HEAP_BY_TYPE;
break;
case 'R':
case 'r':
RtsFlags.ProfFlags.doHeapProfile = HEAP_BY_RETAINER;
break;
case 'B':
case 'b':
RtsFlags.ProfFlags.doHeapProfile = HEAP_BY_LDV;
break;
case 'T':
RtsFlags.ProfFlags.doHeapProfile = HEAP_BY_CLOSURE_TYPE;
break;
}
break;
default:
errorBelch("invalid heap profile option: %s", arg);
error = true;
}
return error;
}