- /* For each regno, there are three chains of refs, one for the uses,
- the eq_uses and the defs. These chains go thru the refs
- themselves rather than using an external structure. */
- struct df_ref *next_reg; /* Next ref with same regno and type. */
- struct df_ref *prev_reg; /* Prev ref with same regno and type. */
+/* The three types of df_refs. Note that the df_ref_extract is an
+ extension of the df_regular_ref, not the df_base_ref. */
+struct df_artificial_ref
+{
+ struct df_base_ref base;
+
+ /* Artificial refs do not have an insn, so to get the basic block,
+ it must be explicitly here. */
+ basic_block bb;
+};
+
+
+struct df_regular_ref
+{
+ struct df_base_ref base;
+ /* The loc is the address in the insn of the reg. This is not
+ defined for special registers, such as clobbers and stack
+ pointers that are also associated with call insns and so those
+ just use the base. */
+ rtx *loc;
+};
+
+
+/* A df_ref_extract is just a df_ref with a width and offset field at
+ the end of it. It is used to hold this information if the ref was
+ wrapped by a SIGN_EXTRACT or a ZERO_EXTRACT and to pass this info
+ to passes that wish to process partial regs precisely. */
+struct df_extract_ref
+{
+ struct df_regular_ref base;
+ int width;
+ int offset;
+ enum machine_mode mode;