(original) (raw)

Hi there,

I'm working on an MIR transformation for X86, and I need to get all memory addresses accessed by any X86 instruction. I've been using MachineInstr::memoperands() to iterate over all MachineMemOperands and using X86II::getMemoryOperandNo() and X86II::getOperandBias() to get the index of the base\_reg MachineOperand. This seems to work fine for most instructions, until I saw the following instruction:

X86: pushq 0x20(%rbx)
MIR: PUSH64rmm renamable rbx</span><spanstyle="background−color:transparent;font−variant−numeric:normal;font−variant−east−asian:normal;font−size:9pt;font−family:Consolas;color:rgb(102,102,0);vertical−align:baseline;white−space:pre−wrap">,</span><spanstyle="background−color:transparent;font−variant−numeric:normal;font−variant−east−asian:normal;font−size:9pt;font−family:Consolas;color:rgb(0,0,0);vertical−align:baseline;white−space:pre−wrap"></span><spanstyle="background−color:transparent;font−variant−numeric:normal;font−variant−east−asian:normal;font−size:9pt;font−family:Consolas;color:rgb(0,102,102);vertical−align:baseline;white−space:pre−wrap">1</span><spanstyle="background−color:transparent;font−variant−numeric:normal;font−variant−east−asian:normal;font−size:9pt;font−family:Consolas;color:rgb(102,102,0);vertical−align:baseline;white−space:pre−wrap">,</span><spanstyle="background−color:transparent;font−variant−numeric:normal;font−variant−east−asian:normal;font−size:9pt;font−family:Consolas;color:rgb(0,0,0);vertical−align:baseline;white−space:pre−wrap">rbx</span><span style="background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;font-size:9pt;font-family:Consolas;color:rgb(102,102,0);vertical-align:baseline;white-space:pre-wrap">,</span><span style="background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;font-size:9pt;font-family:Consolas;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap"> </span><span style="background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;font-size:9pt;font-family:Consolas;color:rgb(0,102,102);vertical-align:baseline;white-space:pre-wrap">1</span><span style="background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;font-size:9pt;font-family:Consolas;color:rgb(102,102,0);vertical-align:baseline;white-space:pre-wrap">,</span><span style="background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;font-size:9pt;font-family:Consolas;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap"> rbx</span><spanstyle="backgroundcolor:transparent;fontvariantnumeric:normal;fontvarianteastasian:normal;fontsize:9pt;fontfamily:Consolas;color:rgb(102,102,0);verticalalign:baseline;whitespace:prewrap">,</span><spanstyle="backgroundcolor:transparent;fontvariantnumeric:normal;fontvarianteastasian:normal;fontsize:9pt;fontfamily:Consolas;color:rgb(0,0,0);verticalalign:baseline;whitespace:prewrap"></span><spanstyle="backgroundcolor:transparent;fontvariantnumeric:normal;fontvarianteastasian:normal;fontsize:9pt;fontfamily:Consolas;color:rgb(0,102,102);verticalalign:baseline;whitespace:prewrap">1</span><spanstyle="backgroundcolor:transparent;fontvariantnumeric:normal;fontvarianteastasian:normal;fontsize:9pt;fontfamily:Consolas;color:rgb(102,102,0);verticalalign:baseline;whitespace:prewrap">,</span><spanstyle="backgroundcolor:transparent;fontvariantnumeric:normal;fontvarianteastasian:normal;fontsize:9pt;fontfamily:Consolas;color:rgb(0,0,0);verticalalign:baseline;whitespace:prewrap">noreg, 32, noreg</span><spanstyle="background−color:transparent;font−variant−numeric:normal;font−variant−east−asian:normal;font−size:9pt;font−family:Consolas;color:rgb(102,102,0);vertical−align:baseline;white−space:pre−wrap">,</span><spanstyle="background−color:transparent;font−variant−numeric:normal;font−variant−east−asian:normal;font−size:9pt;font−family:Consolas;color:rgb(0,0,0);vertical−align:baseline;white−space:pre−wrap"></span><spanstyle="background−color:transparent;font−variant−numeric:normal;font−variant−east−asian:normal;font−size:9pt;font−family:Consolas;color:rgb(0,0,136);vertical−align:baseline;white−space:pre−wrap">implicit</span><spanstyle="background−color:transparent;font−variant−numeric:normal;font−variant−east−asian:normal;font−size:9pt;font−family:Consolas;color:rgb(102,102,0);vertical−align:baseline;white−space:pre−wrap">−</span><spanstyle="background−color:transparent;font−variant−numeric:normal;font−variant−east−asian:normal;font−size:9pt;font−family:Consolas;color:rgb(0,0,136);vertical−align:baseline;white−space:pre−wrap">def</span><spanstyle="background−color:transparent;font−variant−numeric:normal;font−variant−east−asian:normal;font−size:9pt;font−family:Consolas;color:rgb(0,0,0);vertical−align:baseline;white−space:pre−wrap">noreg</span><span style="background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;font-size:9pt;font-family:Consolas;color:rgb(102,102,0);vertical-align:baseline;white-space:pre-wrap">,</span><span style="background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;font-size:9pt;font-family:Consolas;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap"> </span><span style="background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;font-size:9pt;font-family:Consolas;color:rgb(0,0,136);vertical-align:baseline;white-space:pre-wrap">implicit</span><span style="background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;font-size:9pt;font-family:Consolas;color:rgb(102,102,0);vertical-align:baseline;white-space:pre-wrap">-</span><span style="background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;font-size:9pt;font-family:Consolas;color:rgb(0,0,136);vertical-align:baseline;white-space:pre-wrap">def</span><span style="background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;font-size:9pt;font-family:Consolas;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap"> noreg</span><spanstyle="backgroundcolor:transparent;fontvariantnumeric:normal;fontvarianteastasian:normal;fontsize:9pt;fontfamily:Consolas;color:rgb(102,102,0);verticalalign:baseline;whitespace:prewrap">,</span><spanstyle="backgroundcolor:transparent;fontvariantnumeric:normal;fontvarianteastasian:normal;fontsize:9pt;fontfamily:Consolas;color:rgb(0,0,0);verticalalign:baseline;whitespace:prewrap"></span><spanstyle="backgroundcolor:transparent;fontvariantnumeric:normal;fontvarianteastasian:normal;fontsize:9pt;fontfamily:Consolas;color:rgb(0,0,136);verticalalign:baseline;whitespace:prewrap">implicit</span><spanstyle="backgroundcolor:transparent;fontvariantnumeric:normal;fontvarianteastasian:normal;fontsize:9pt;fontfamily:Consolas;color:rgb(102,102,0);verticalalign:baseline;whitespace:prewrap"></span><spanstyle="backgroundcolor:transparent;fontvariantnumeric:normal;fontvarianteastasian:normal;fontsize:9pt;fontfamily:Consolas;color:rgb(0,0,136);verticalalign:baseline;whitespace:prewrap">def</span><spanstyle="backgroundcolor:transparent;fontvariantnumeric:normal;fontvarianteastasian:normal;fontsize:9pt;fontfamily:Consolas;color:rgb(0,0,0);verticalalign:baseline;whitespace:prewrap">rsp, implicit $rsp

For the above MachineInstr, MachineInstr::getNumMemOperands() returns 0: there's no MachineMemOperands. However, this instruction clearly accesses the memory address specified by \[%rbx + 0x20\]. I wonder how I can get the memory addresses for instructions like this?

Thanks!
Yuanfeng Peng