[LLVMdev] [RFC] New StackMap format proposal (StackMap v2)

Andrew Trick atrick at apple.com
Thu Jul 9 14:34:38 PDT 2015


> On Jul 9, 2015, at 2:19 PM, Andrew Trick <atrick at apple.com> wrote:
> 
> 
>> On Jul 9, 2015, at 2:04 PM, Juergen Ributzka <juergen at apple.com <mailto:juergen at apple.com>> wrote:
>> 
>> Hi @ll,
>> 
>> over the past year we gained more experience with the patchpoint/stackmap/statepoint intrinsics and it exposed limitations in the stackmap format.
>> The following proposal includes feedback and request from several interested parties and I would like to hear your feedback.
> 
> Looks really nice. Do we care about field alignment though?

Never mind. I just noticed that you took care of natural alignment by reserving byte arrays (Reserved [3]) and adding “align to”  notes before each set of records.

Andy

>> Missing correlation between functions and stackmap records:
>> Originally the client had to keep track of the ID to know which stackmap record belongs to which function, but this would stop working once functions are inlined.
>> The new format fixes that by adding a direct reference from the function to the stackmap records.
>> 
>> Call Size and Function Size:
>> These are additional information that are of interest and have been added to the format.
>> @Swaroop: Could you please provide a little more detailed explanation on the "Call Size" field and what exactly is there recorded. Is it just the call instruction
>> or also the materialization code for the address? For what is this used for?
> 
> I think the number of patchable bytes should be recorded (including the call itself), but I don’t know exactly how Swaroop is using it.
> 
> Andy
> 
>> Flat format:
>> We think moving to a flat form will make parsing easier, because every record has a fixed size and offsets can be calculated easily. The plan is to also
>> provide parsers for both stackmap versions (there is already one for the first format in tree) and a corresponding C-API to make it easier for clients to
>> adopt the new format. There is no plan to drop the original format and we will continue to support both formats. I will ask for feedback on the C API in a
>> separate RFC. 
>> 
>> Another benefit we hope to achieve from this format is to optimize for size by uniquing entries - but that is independent optimization and not required.
>> 
>> More detailed frame record:
>> Clients require more information about the function frame, such as spilled registers, etc. The frame base register i.e. might change when dynamic stack
>> realignment is performed on X86.
>> 
>> 
>> If there is anything missing please let me know.
>> 
>> Thanks
>> 
>> Cheers,
>> Juergen
>> 
>> 
>> Header v2 {
>>   uint8  : Stack Map Version (2)
>>   uint8  : Reserved [3] (0)
>>   uint32 : Constants Offset (bytes)
>>   uint32 : Frame Records Offset (bytes)
>>   uint32 : Frame Registers Offset (bytes)
>>   uint32 : StackMap Records Offset (bytes)
>>   uint32 : Locations Offset (bytes)
>>   uint32 : LiveOuts Offset (bytes)
>> }
>> 
>> align to 8 bytes
>> Constants[] {
>>   uint64 : LargeConstant
>> }
>> 
>> align to 8 bytes
>> FrameRecord[] {
>>   uint64 : Function Address
>>   uint32 : Function Size
>>   uint32 : Stack Size
>>   uint16 : Flags {
>>     bool : HasFrame
>>     bool : HasVariableSizeAlloca
>>     bool : HasStackRealignment
>>     bool : HasLiveOutInfo
>>     bool : Reserved [12]
>>   }
>>   uint16 : Frame Base Register Dwarf RegNum
>>   uint16 : Num Frame Registers
>>   uint16 : Frame Register Index
>>   uint16 : Num StackMap Records
>>   uint16 : StackMap Record Index
>> }
>> 
>> align to 4 bytes
>> FrameRegister[] {
>>   uint16 : Dwarf RegNum
>>   int16  : Offset
>>   uint8  : Size in Bytes
>>   uint8  : Flags {
>>     bool : IsSpilled
>>     bool : Reserved [7]
>>   }
>> }
>> 
>> align to 8 bytes
>> StackMapRecord[] {
>>   uint64 : PatchPoint ID
>>   uint32 : Instruction Offset
>>   uint8  : Call size (bytes)
>>   uint8  : Flags {
>>     bool : HasLiveOutInfo
>>     bool : Reserved [7]
>>   }
>>   uint16 : Num Locations
>>   uint16 : Location Index
>>   uint16 : Num LiveOuts
>>   uint16 : LiveOut Index
>> }
>> 
>> align to 4 bytes
>> Location[] {
>>   uint8  : Register | Direct | Indirect | Constant | ConstantIndex
>>   uint8  : Reserved (location flags)
>>   uint16 : Dwarf RegNum
>>   int32  : Offset or SmallConstant
>> }
>> 
>> align to 2 bytes
>> LiveOuts[] {
>>   uint16 : Dwarf RegNum
>>   uint8  : Reserved
>>   uint8  : Size in Bytes
>> }
>> 
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150709/1fa29b71/attachment.html>


More information about the llvm-dev mailing list