code: def _map_block_index_to_location(ir_blocks):
      
      block_index_to_location = {}
      # MarkLocation blocks occur after the blocks related to that location.
      # The core approach here is to buffer blocks until their MarkLocation is encountered
      # after which all buffered blocks can be associated with the encountered MarkLocation.location.
      current_block_ixs = []
      for num, ir_block in enumerate(ir_blocks):
          if isinstance(ir_block, blocks.GlobalOperationsStart):
              if len(current_block_ixs) > 0:
                  unassociated_blocks = [ir_blocks[ix] for ix in current_block_ixs]
                  raise AssertionError(
                      u'Unexpectedly encountered global operations before mapping blocks '
                      u'{} to their respective locations.'.format(unassociated_blocks))
              break
          current_block_ixs.append(num)
          if isinstance(ir_block, blocks.MarkLocation):
              for ix in current_block_ixs:
                  block_index_to_location[ix] = ir_block.location
              current_block_ixs = []
      return block_index_to_location
docs: Associate each IR block with its corresponding location, by index.