[PATCH] Added a size field to the stack map record to handle	subregister spills.
    Jakob Stoklund Olesen 
    stoklund at 2pi.dk
       
    Fri Nov 15 10:24:57 PST 2013
    
    
  
On Nov 15, 2013, at 10:06 AM, Andrew Trick <atrick at apple.com> wrote:
> Hi ributzka, lhames,
> 
> Implementing this on bigendian platforms could get strange. I added a
> target hook, getStackSlotRange, per Jakob's recommendation to make
> this as explicit as possible.
Hi Andy,
Just commenting on the getStackSlotRange function:
+void TargetInstrInfo::getStackSlotRange(const TargetRegisterClass *RC,
+                                        unsigned SubIdx, unsigned &Size,
+                                        int &Offset,
+                                        const TargetMachine *TM) const {
Would it be more natural to return a bool error instead of using a signed Offset?
+  if (!TM->getDataLayout()->isLittleEndian()) {
+    report_fatal_error("Big endian spill slot ranges are unimplemented on "
+                       "this platform.");
+  }
You can give the BE guys a decent default implementation with RC->getSize() - (Size+Offset).
+  if (SubIdx) {
+    Size = TM->getRegisterInfo()->getSubRegIdxSize(SubIdx);
+    // Convert bit size to byte size to be consistent with
+    // MCRegisterClass::getSize().
+    assert((Size % 8) == 0 && "subreg not byte-sized");
It's perfectly fine for a sub-register to be a non-multiple of 8. You should return an error, not assert here.
+    Size /= 8;
+    Offset = TM->getRegisterInfo()->getSubRegIdxOffset(SubIdx);
+    if (Offset > 0) {
+      assert(((unsigned)Offset % 8) == 0 && "subreg not byte-sized");
Same.
+      Offset = (unsigned)Offset / 8;
+    }
+  }
+  else {
+    Size = RC->getSize();
+    Offset = 0;
Could you make the SubIdx==0 case an early return to reduce indentation?
Thanks,
/jakob
    
    
More information about the llvm-commits
mailing list