This patch adds yet another entry in CFLAAResult::FunctionInfo that keeps track of what StratifiedAttrs we should propagate for those InterfaceValues. This is crucial for the soundness of the analysis since otherwise the caller won't be able to know if the arguments they pass to the callee will escape/alias globals/alias unknown pointers or not.
Previously, anything below the arguments of the callee is marked with "AttrUnknown". This is too conservative, because although the callee doesn't know what's below those arguments, the caller has a perfect idea. It would be nice to distinguish between "things the caller knows but the callee doesn't" and "things that both caller and callee don't know". In this patch, we introduce another StratifiedAttr called "AttrCaller" to represent the former case, and let "AttrUnknown" to represent only the latter case. We also handle these two attributes differently in our interprocedural analysis: AttrUnknown needs to be propagated to the caller, while AttrCaller doesn't have to.
In addition to AttrUnknown, AttrEscaped and AttrGlobal are also propagated. Those are the three attributes that I think are meaningful to the caller.
With this patch I am finally able to turn the last two remaining xfail test cases into xpass. Yay!