label.c 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /* $Header$ */
  2. /* L A B E L H A N D L I N G */
  3. #include "Lpars.h"
  4. #include "level.h"
  5. #include "idf.h"
  6. #include "label.h"
  7. #include "arith.h"
  8. #include "def.h"
  9. #include "type.h"
  10. extern char options[];
  11. define_label(idf)
  12. struct idf *idf;
  13. {
  14. /* The identifier idf is defined as a label. If it is new,
  15. it is entered into the idf list with the largest possible
  16. scope, i.e., on the lowest possible level.
  17. */
  18. enter_label(idf, 1);
  19. }
  20. apply_label(idf)
  21. struct idf *idf;
  22. {
  23. /* The identifier idf is applied as a label. It may or may
  24. not be there, and if it is there, it may be from a
  25. declaration or another application.
  26. */
  27. enter_label(idf, 0);
  28. }
  29. enter_label(idf, defining)
  30. struct idf *idf;
  31. {
  32. /* The identifier idf is entered as a label. If it is new,
  33. it is entered into the idf list with the largest possible
  34. scope, i.e., on the lowest possible level.
  35. If defining, the label comes from a label statement.
  36. */
  37. if (idf->id_def) {
  38. struct def *def = idf->id_def;
  39. if (def->df_sc == LABEL) {
  40. if (defining && def->df_initialized)
  41. error("redeclaration of label %s",
  42. idf->id_text);
  43. }
  44. else { /* there may still be room for it */
  45. int deflevel = def->df_level;
  46. if (options['R'] && def->df_sc == TYPEDEF)
  47. warning("label %s is also a typedef",
  48. idf->id_text);
  49. if (deflevel == level) /* but alas, no */
  50. error("%s is not a label", idf->id_text);
  51. else {
  52. int lvl;
  53. if (options['R'] && deflevel > L_LOCAL)
  54. warning("label %s is not function-wide",
  55. idf->id_text);
  56. lvl = deflevel + 1;
  57. if (lvl < L_LOCAL)
  58. lvl = L_LOCAL;
  59. add_def(idf, LABEL, label_type, lvl);
  60. }
  61. }
  62. }
  63. else {
  64. add_def(idf, LABEL, label_type, L_LOCAL);
  65. }
  66. if (idf->id_def->df_address == 0)
  67. idf->id_def->df_address = (arith) text_label();
  68. if (defining)
  69. idf->id_def->df_initialized = 1;
  70. }
  71. unstack_label(idf)
  72. struct idf *idf;
  73. {
  74. /* The scope in which the label idf occurred is left.
  75. */
  76. if (!idf->id_def->df_initialized && !is_anon_idf(idf))
  77. error("label %s not defined", idf->id_text);
  78. }