-
-static e_dw_location_type get_location(char *expr, dw_location_t entry){
-
- int cursor = 0;
- char *tok = NULL, *tmp_tok = NULL;
-
- xbt_dynar_t tokens = xbt_str_split(expr, NULL);
- xbt_dynar_remove_at(tokens, xbt_dynar_length(tokens) - 1, NULL);
-
- if(xbt_dynar_length(tokens) > 1){
-
- entry->type = e_dw_compose;
- entry->location.compose = xbt_dynar_new(sizeof(dw_location_t), NULL);
-
- while(cursor < xbt_dynar_length(tokens)){
-
- tok = xbt_dynar_get_as(tokens, cursor, char*);
-
- if(strncmp(tok, "DW_OP_reg", 9) == 0){
- dw_location_t new_element = xbt_new0(s_dw_location_t, 1);
- new_element->type = e_dw_register;
- if(tok[9] == 'x'){
- new_element->location.reg = atoi(xbt_dynar_get_as(tokens, ++cursor, char*));
- }else{
- new_element->location.reg = atoi(strtok(tok, "DW_OP_reg"));
- }
- xbt_dynar_push(entry->location.compose, &new_element);
- }else if(strcmp(tok, "DW_OP_fbreg") == 0){
- dw_location_t new_element = xbt_new0(s_dw_location_t, 1);
- new_element->type = e_dw_fbregister_op;
- new_element->location.fbreg_op = atoi(xbt_dynar_get_as(tokens, ++cursor, char*));
- xbt_dynar_push(entry->location.compose, &new_element);
- }else if(strncmp(tok, "DW_OP_breg", 10) == 0){
- dw_location_t new_element = xbt_new0(s_dw_location_t, 1);
- new_element->type = e_dw_bregister_op;
- if(tok[10] == 'x'){
- new_element->location.breg_op.reg = atoi(xbt_dynar_get_as(tokens, ++cursor, char*));
- new_element->location.breg_op.offset = atoi(xbt_dynar_get_as(tokens, ++cursor, char*));
- }else{
- if(strchr(tok,'+') != NULL){
- tmp_tok = strtok(tok,"DW_OP_breg");
- new_element->location.breg_op.reg = atoi(strtok(tmp_tok,"+"));
- new_element->location.breg_op.offset = atoi(strtok(NULL,"+"));
- }else{
- new_element->location.breg_op.reg = atoi(strtok(tok, "DW_OP_breg"));
- new_element->location.breg_op.offset = atoi(xbt_dynar_get_as(tokens, ++cursor, char*));
- }
- }
- xbt_dynar_push(entry->location.compose, &new_element);
- }else if(strncmp(tok, "DW_OP_lit", 9) == 0){
- dw_location_t new_element = xbt_new0(s_dw_location_t, 1);
- new_element->type = e_dw_lit;
- new_element->location.lit = atoi(strtok(tok, "DW_OP_lit"));
- xbt_dynar_push(entry->location.compose, &new_element);
- }else if(strcmp(tok, "DW_OP_piece") == 0){
- dw_location_t new_element = xbt_new0(s_dw_location_t, 1);
- new_element->type = e_dw_piece;
- if(strlen(xbt_dynar_get_as(tokens, ++cursor, char*)) > 1)
- new_element->location.piece = atoi(xbt_dynar_get_as(tokens, cursor, char*));
- else
- new_element->location.piece = xbt_dynar_get_as(tokens, cursor, char*)[0] - '0';
- xbt_dynar_push(entry->location.compose, &new_element);
-
- }else if(strcmp(tok, "DW_OP_abs") == 0 ||
- strcmp(tok, "DW_OP_and") == 0 ||
- strcmp(tok, "DW_OP_div") == 0 ||
- strcmp(tok, "DW_OP_minus") == 0 ||
- strcmp(tok, "DW_OP_mod") == 0 ||
- strcmp(tok, "DW_OP_mul") == 0 ||
- strcmp(tok, "DW_OP_neg") == 0 ||
- strcmp(tok, "DW_OP_not") == 0 ||
- strcmp(tok, "DW_OP_or") == 0 ||
- strcmp(tok, "DW_OP_plus") == 0 ||
- strcmp(tok, "DW_OP_plus_uconst") == 0){
- dw_location_t new_element = xbt_new0(s_dw_location_t, 1);
- new_element->type = e_dw_arithmetic;
- new_element->location.arithmetic = strdup(strtok(tok, "DW_OP_"));
- xbt_dynar_push(entry->location.compose, &new_element);
- }else if(strcmp(tok, "DW_OP_stack_value") == 0){
- cursor++;
- }else if(strcmp(tok, "DW_OP_deref_size") == 0){
- dw_location_t new_element = xbt_new0(s_dw_location_t, 1);
- new_element->type = e_dw_deref;
- if(strlen(xbt_dynar_get_as(tokens, ++cursor, char*)) > 1)
- new_element->location.deref_size = atoi(xbt_dynar_get_as(tokens, cursor, char*));
- else
- new_element->location.deref_size = xbt_dynar_get_as(tokens, cursor, char*)[0] - '0';
- xbt_dynar_push(entry->location.compose, &new_element);
- }else if(strcmp(tok, "DW_OP_deref") == 0){
- dw_location_t new_element = xbt_new0(s_dw_location_t, 1);
- new_element->type = e_dw_deref;
- new_element->location.deref_size = sizeof(void *);
- xbt_dynar_push(entry->location.compose, &new_element);
- }else if(strcmp(tok, "DW_OP_constu") == 0){
- dw_location_t new_element = xbt_new0(s_dw_location_t, 1);
- new_element->type = e_dw_constant;
- new_element->location.constant.is_signed = 0;
- new_element->location.constant.bytes = 1;
- if(strlen(xbt_dynar_get_as(tokens, ++cursor, char*)) > 1)
- new_element->location.constant.value = atoi(xbt_dynar_get_as(tokens, cursor, char*));
- else
- new_element->location.constant.value = xbt_dynar_get_as(tokens, cursor, char*)[0] - '0';
- xbt_dynar_push(entry->location.compose, &new_element);
- }else if(strcmp(tok, "DW_OP_consts") == 0){
- dw_location_t new_element = xbt_new0(s_dw_location_t, 1);
- new_element->type = e_dw_constant;
- new_element->location.constant.is_signed = 1;
- new_element->location.constant.bytes = 1;
- new_element->location.constant.value = atoi(xbt_dynar_get_as(tokens, ++cursor, char*));
- xbt_dynar_push(entry->location.compose, &new_element);
- }else if(strcmp(tok, "DW_OP_const1u") == 0 ||
- strcmp(tok, "DW_OP_const2u") == 0 ||
- strcmp(tok, "DW_OP_const4u") == 0 ||
- strcmp(tok, "DW_OP_const8u") == 0){
- dw_location_t new_element = xbt_new0(s_dw_location_t, 1);
- new_element->type = e_dw_constant;
- new_element->location.constant.is_signed = 0;
- new_element->location.constant.bytes = tok[11] - '0';
- if(strlen(xbt_dynar_get_as(tokens, ++cursor, char*)) > 1)
- new_element->location.constant.value = atoi(xbt_dynar_get_as(tokens, cursor, char*));
- else
- new_element->location.constant.value = xbt_dynar_get_as(tokens, cursor, char*)[0] - '0';
- xbt_dynar_push(entry->location.compose, &new_element);
- }else if(strcmp(tok, "DW_OP_const1s") == 0 ||
- strcmp(tok, "DW_OP_const2s") == 0 ||
- strcmp(tok, "DW_OP_const4s") == 0 ||
- strcmp(tok, "DW_OP_const8s") == 0){
- dw_location_t new_element = xbt_new0(s_dw_location_t, 1);
- new_element->type = e_dw_constant;
- new_element->location.constant.is_signed = 1;
- new_element->location.constant.bytes = tok[11] - '0';
- new_element->location.constant.value = atoi(xbt_dynar_get_as(tokens, ++cursor, char*));
- xbt_dynar_push(entry->location.compose, &new_element);
- }else{
- dw_location_t new_element = xbt_new0(s_dw_location_t, 1);
- new_element->type = e_dw_unsupported;
- xbt_dynar_push(entry->location.compose, &new_element);
- }
-
- cursor++;
-
- }
-
- xbt_dynar_free(&tokens);
-
- return e_dw_compose;
-
- }else{
-
- if(strncmp(expr, "DW_OP_reg", 9) == 0){
- entry->type = e_dw_register;
- entry->location.reg = atoi(strtok(expr,"DW_OP_reg"));
- }else if(strncmp(expr, "DW_OP_breg", 10) == 0){
- entry->type = e_dw_bregister_op;
- tok = strtok(expr, "+");
- entry->location.breg_op.offset = atoi(strtok(NULL, "+"));
- entry->location.breg_op.reg = atoi(strtok(tok, "DW_OP_breg"));
- }else{
- entry->type = e_dw_unsupported;
- }
-
- xbt_dynar_free(&tokens);
-
- return entry->type;
-
- }
-
-}