Provenance should be "threaded-through" the values returned by instructions like gep and extractelement. This requires maintaining lists of provenance entries for struct values (not at run-time, just as part of the state of the instrumentation pass).