+stateAction stateAction_fromNState (nstate ns)
+{
+ switch (ns)
+ {
+ case NS_ERROR:
+ case NS_UNKNOWN:
+ return SA_UNKNOWN;
+ case NS_NOTNULL:
+ case NS_MNOTNULL:
+ return SA_BECOMESNONNULL;
+ case NS_RELNULL:
+ case NS_CONSTNULL:
+ return SA_DECLARED;
+ case NS_POSNULL:
+ return SA_BECOMESPOSSIBLYNULL;
+ case NS_DEFNULL:
+ return SA_BECOMESNULL;
+ case NS_ABSNULL:
+ return SA_BECOMESPOSSIBLYNULL;
+ }
+}
+
+stateAction stateAction_fromExkind (exkind ex)
+{
+ switch (ex)
+ {
+ case XO_UNKNOWN:
+ case XO_NORMAL:
+ return SA_UNKNOWN;
+ case XO_EXPOSED:
+ return SA_EXPOSED;
+ case XO_OBSERVER:
+ return SA_OBSERVER;
+ }
+
+ BADBRANCH;
+ /*@notreached@*/ return SA_UNKNOWN;
+}
+
+stateAction stateAction_fromAlkind (alkind ak)
+{
+ switch (ak)
+ {
+ case AK_UNKNOWN:
+ case AK_ERROR:
+ return SA_UNKNOWN;
+ case AK_ONLY:
+ return SA_ONLY;
+ case AK_IMPONLY:
+ return SA_IMPONLY;
+ case AK_KEEP:
+ return SA_KEEP;
+ case AK_KEPT:
+ return SA_KEPT;
+ case AK_TEMP:
+ return SA_TEMP;
+ case AK_IMPTEMP:
+ return SA_IMPTEMP;
+ case AK_SHARED:
+ return SA_SHARED;
+ case AK_UNIQUE:
+ case AK_RETURNED:
+ return SA_DECLARED;
+ case AK_FRESH:
+ return SA_FRESH;
+ case AK_STACK:
+ return SA_XSTACK;
+ case AK_REFCOUNTED:
+ return SA_REFCOUNTED;
+ case AK_REFS:
+ return SA_REFS;
+ case AK_KILLREF:
+ return SA_KILLREF;
+ case AK_NEWREF:
+ return SA_NEWREF;
+ case AK_OWNED:
+ return SA_OWNED;
+ case AK_DEPENDENT:
+ return SA_DEPENDENT;
+ case AK_IMPDEPENDENT:
+ return SA_IMPDEPENDENT;
+ case AK_STATIC:
+ return SA_STATIC;
+ case AK_LOCAL:
+ return SA_LOCAL;
+ }
+
+ BADBRANCH;
+ /*@notreached@*/ return SA_UNKNOWN;
+}
+
+stateAction stateAction_fromSState (sstate ss)
+{
+ switch (ss)
+ {
+ case SS_UNKNOWN: return SA_DECLARED;
+ case SS_UNUSEABLE: return SA_KILLED;
+ case SS_UNDEFINED: return SA_UNDEFINED;
+ case SS_MUNDEFINED: return SA_MUNDEFINED;
+ case SS_ALLOCATED: return SA_ALLOCATED;
+ case SS_PDEFINED: return SA_PDEFINED;
+ case SS_DEFINED: return SA_DEFINED;
+ case SS_PARTIAL: return SA_PDEFINED;
+ case SS_DEAD: return SA_RELEASED;
+ case SS_HOFFA: return SA_PKILLED;
+ case SS_SPECIAL: return SA_DECLARED;
+ case SS_RELDEF: return SA_DECLARED;
+ case SS_FIXED:
+ case SS_UNDEFGLOB:
+ case SS_KILLED:
+ case SS_UNDEFKILLED:
+ case SS_LAST:
+ llbug (message ("Unexpected sstate: %s", sstate_unparse (ss)));
+ /*@notreached@*/ return SA_UNKNOWN;
+ }
+}
+
+static /*@observer@*/ cstring stateAction_unparse (stateAction sa)
+{
+ switch (sa)
+ {
+ case SA_UNKNOWN: return cstring_makeLiteralTemp ("changed <unknown modification>");
+ case SA_CHANGED: return cstring_makeLiteralTemp ("changed");
+
+ case SA_CREATED: return cstring_makeLiteralTemp ("created");
+ case SA_DECLARED: return cstring_makeLiteralTemp ("declared");
+ case SA_DEFINED: return cstring_makeLiteralTemp ("defined");
+ case SA_PDEFINED: return cstring_makeLiteralTemp ("partially defined");
+ case SA_RELEASED: return cstring_makeLiteralTemp ("released");
+ case SA_ALLOCATED: return cstring_makeLiteralTemp ("allocated");
+ case SA_KILLED: return cstring_makeLiteralTemp ("released");
+ case SA_PKILLED: return cstring_makeLiteralTemp ("possibly released");
+ case SA_MERGED: return cstring_makeLiteralTemp ("merged");
+ case SA_UNDEFINED: return cstring_makeLiteralTemp ("becomes undefined");
+ case SA_MUNDEFINED: return cstring_makeLiteralTemp ("possibly undefined");
+
+ case SA_SHARED: return cstring_makeLiteralTemp ("becomes shared");
+ case SA_ONLY: return cstring_makeLiteralTemp ("becomes only");
+ case SA_IMPONLY: return cstring_makeLiteralTemp ("becomes implicitly only");
+ case SA_OWNED: return cstring_makeLiteralTemp ("becomes owned");
+ case SA_DEPENDENT: return cstring_makeLiteralTemp ("becomes dependent");
+ case SA_IMPDEPENDENT: return cstring_makeLiteralTemp ("becomes implicitly dependent");
+ case SA_KEPT: return cstring_makeLiteralTemp ("becomes kept");
+ case SA_KEEP: return cstring_makeLiteralTemp ("becomes keep");
+ case SA_FRESH: return cstring_makeLiteralTemp ("becomes fresh");
+ case SA_TEMP: return cstring_makeLiteralTemp ("becomes temp");
+ case SA_IMPTEMP: return cstring_makeLiteralTemp ("becomes implicitly temp");
+ case SA_XSTACK: return cstring_makeLiteralTemp ("becomes stack-allocated storage");
+ case SA_STATIC: return cstring_makeLiteralTemp ("becomes static");
+ case SA_LOCAL: return cstring_makeLiteralTemp ("becomes local");
+
+ case SA_REFCOUNTED: return cstring_makeLiteralTemp ("becomes refcounted");
+ case SA_REFS: return cstring_makeLiteralTemp ("becomes refs");
+ case SA_NEWREF: return cstring_makeLiteralTemp ("becomes newref");
+ case SA_KILLREF: return cstring_makeLiteralTemp ("becomes killref");
+
+ case SA_OBSERVER: return cstring_makeLiteralTemp ("becomes observer");
+ case SA_EXPOSED: return cstring_makeLiteralTemp ("becomes exposed");
+
+ case SA_BECOMESNULL: return cstring_makeLiteralTemp ("becomes null");
+ case SA_BECOMESNONNULL: return cstring_makeLiteralTemp ("becomes non-null");
+ case SA_BECOMESPOSSIBLYNULL: return cstring_makeLiteralTemp ("becomes possibly null");
+ }
+
+ DPRINTF (("Bad state action: %d", sa));
+ BADBRANCH;
+}
+