+ DPRINTF (("After merge: %s", sRef_unparseFull (res->sref)));
+}
+
+static void
+uentry_mergeValueStates (/*@notnull@*/ uentry res, /*@notnull@*/ uentry other,
+ fileloc loc, bool mustReturn, /*@unused@*/ bool flip)
+{
+ valueTable rvalues;
+ valueTable ovalues;
+
+ DPRINTF (("Merge values: %s / %s", sRef_unparseFull (res->sref), sRef_unparseFull (other->sref)));
+
+ if (mustReturn)
+ {
+ return;
+ }
+ /* flip? */
+
+ rvalues = sRef_getValueTable (res->sref);
+ ovalues = sRef_getValueTable (other->sref);
+
+ if (valueTable_isUndefined (ovalues))
+ {
+ DPRINTF (("No value table: %s", sRef_unparseFull (other->sref)));
+ ;
+ }
+ else if (valueTable_isUndefined (rvalues))
+ {
+ /*
+ ** Copy values from other
+ */
+
+ /* ??? */
+ }
+ else
+ {
+ valueTable_elements (ovalues, fkey, fval) {
+ stateValue tval;
+ metaStateInfo minfo;
+ stateCombinationTable sctable;
+ cstring msg;
+ int nval;
+
+ tval = valueTable_lookup (rvalues, fkey);
+
+ DPRINTF (("Merge value: %s / %s X %s", fkey,
+ stateValue_unparse (fval), stateValue_unparse (tval)));
+
+ minfo = context_lookupMetaStateInfo (fkey);
+ llassert (stateValue_isDefined (tval));
+
+ if (metaStateInfo_isUndefined (minfo) || !stateValue_isDefined (tval))
+ {
+ DPRINTF (("Cannot find meta state for: %s", fkey));
+ BADBRANCH;
+ }
+ else
+ {
+ llassert (metaStateInfo_isDefined (minfo));
+
+ if (stateValue_isError (fval)
+ || sRef_definitelyNullContext (res->sref))
+ {
+ sRef_setMetaStateValueComplete (res->sref,
+ fkey, stateValue_getValue (fval),
+ stateValue_getLoc (fval));
+ DPRINTF (("Setting res: %s", sRef_unparseFull (res->sref)));
+ }
+ else if (stateValue_isError (tval)
+ || sRef_definitelyNullAltContext (other->sref))
+ {
+ DPRINTF (("Other branch is definitely null!"));
+ }
+ else if (sRef_isStateUndefined (res->sref)
+ || sRef_isDead (res->sref))
+ {
+ ; /* Combination state doesn't matter if it is undefined or dead */
+ }
+ else
+ {
+ DPRINTF (("Check: %s / %s / %s / %s", fkey,
+ metaStateInfo_unparse (minfo),
+ stateValue_unparse (fval),
+ stateValue_unparse (tval)));
+
+ DPRINTF (("state values: %d / %d",
+ stateValue_getValue (fval), stateValue_getValue (tval)));
+
+ sctable = metaStateInfo_getMergeTable (minfo);
+
+ DPRINTF (("Merge table: %s",
+ stateCombinationTable_unparse (sctable)));
+
+ msg = cstring_undefined;
+
+ nval = stateCombinationTable_lookup (sctable,
+ stateValue_getValue (fval),
+ stateValue_getValue (tval),
+ &msg);
+
+ DPRINTF (("nval: %d / %d / %d", nval,
+ stateValue_getValue (fval), stateValue_getValue (tval)));
+
+ if (nval == stateValue_error)
+ {
+ if (uentry_isGlobalMarker (res))
+ {
+ if (optgenerror
+ (FLG_STATEMERGE,
+ message
+ ("Control branches merge with incompatible global states (%s and %s)%q",
+ metaStateInfo_unparseValue (minfo, stateValue_getValue (fval)),
+ metaStateInfo_unparseValue (minfo, stateValue_getValue (tval)),
+ cstring_isDefined (msg)
+ ? message (": %s", msg) : cstring_undefined),
+ loc))
+ {
+ sRef_showMetaStateInfo (res->sref, fkey);
+ sRef_showMetaStateInfo (other->sref, fkey);
+ }
+ }
+ else
+ {
+ if (optgenerror
+ (FLG_STATEMERGE,
+ message
+ ("Control branches merge with incompatible states for %q (%s and %s)%q",
+ uentry_getName (res),
+ metaStateInfo_unparseValue (minfo, stateValue_getValue (fval)),
+ metaStateInfo_unparseValue (minfo, stateValue_getValue (tval)),
+ cstring_isDefined (msg)
+ ? message (": %s", msg) : cstring_undefined),
+ loc))
+ {
+ sRef_showMetaStateInfo (res->sref, fkey);
+ sRef_showMetaStateInfo (other->sref, fkey);
+ DPRINTF (("Res: %s", sRef_unparseFull (res->sref)));
+ DPRINTF (("Other: %s", sRef_unparseFull (other->sref)));
+ DPRINTF (("Null: %s / %s",
+ bool_unparse (usymtab_isDefinitelyNull (res->sref)),
+ bool_unparse (usymtab_isDefinitelyNull (other->sref))));
+
+ }
+ }
+ }
+
+ if (nval == stateValue_getValue (fval)
+ && nval != stateValue_getValue (tval))
+ {
+ loc = stateValue_getLoc (fval);
+ }
+ else if (nval == stateValue_getValue (tval)
+ && nval != stateValue_getValue (fval))
+ {
+ loc = stateValue_getLoc (tval);
+ }
+ else
+ {
+ ;
+ }
+
+ if (stateValue_getValue (sRef_getMetaStateValue (res->sref, fkey)) == nval
+ && nval == stateValue_getValue (fval)
+ && nval == stateValue_getValue (tval))
+ {
+ ;
+ }
+ else
+ {
+ sRef_setMetaStateValueComplete (res->sref, fkey, nval, loc);
+ }
+ }
+ }
+ } end_valueTable_elements ;
+ }
+}
+
+
+static void
+uentry_mergeSetStates (/*@notnull@*/ uentry res,
+ /*@notnull@*/ uentry other, /*@unused@*/ fileloc loc,
+ bool flip, clause cl)
+{
+ if (cl == DOWHILECLAUSE)
+ {
+ res->used = other->used || res->used;
+ res->lset = other->lset || res->lset;
+ res->uses = filelocList_append (res->uses, other->uses);
+ other->uses = filelocList_undefined;
+ }
+ else
+ {
+ if (sRef_isMacroParamRef (res->sref)
+ && !uentry_isSefParam (other)
+ && !uentry_isSefParam (res))