@Override
	public void setProgramCounter(Lifespan span, Address pc) {
		//System.err.println("setPC(threadKey=" + stack.getThread().getKey() + ",snap=" +
		//	stack.getSnap() + ",level=" + level + ",pc=" + pc + ");");
		manager.trace.assertValidAddress(pc);
		try (LockHold hold = LockHold.lock(manager.lock.writeLock())) {
			if (Objects.equals(this.pc, pc)) {
				return;
			}
			this.pc = pc;
			update(PC_COLUMN);
		}
		manager.trace.setChanged(
			new TraceChangeRecord<>(TraceEvents.STACK_CHANGED, null, stack, 0L, span.lmin()));
	}
The implementation of a stack frame, directly via a database object

<p>
Version history:
<ul>
<li>1: Change {@link #pc} to 10-byte fixed encoding, make it sparse, so optional</li>
<li>0: Initial version and previous unversioned implementations</li>
</ul>
Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/stack/DBTraceStackFrame.java