about summary refs log blame commit diff stats
path: root/subx/033non_code_segment.cc
blob: 829a61ca1f680382494f4bf0f543ace1b9bfea92 (plain) (tree)
1
2
3
4
5
6
7
8
9
10




                                                                      
            



                                                                          


                                         
       
                                                              
                                                                                













                                                                                                                          
//: Raise an error when operand metadata is used in non-code segments.

:(scenario operand_metadata_outside_code_segment)
% Hide_errors = true;
== 0x1  # code segment
cd 0x80/imm8
== 0x1000  # data segment
cd 12/imm8
+error: 12/imm8: metadata imm8 is only allowed in the (first) code segment

:(after "Pack Operands")
ensure_operands_only_in_code_segments(p);
if (trace_contains_errors()) return;
:(code)
void ensure_operands_only_in_code_segments(const program& p) {
  trace(99, "transform") << "-- ensure operands only in code segments" << end();
  if (p.segments.empty()) return;
  for (int i = /*skip code segment*/1;  i < SIZE(p.segments);  ++i) {
    const segment& seg = p.segments.at(i);
    for (int j = 0;  j < SIZE(seg.lines);  ++j) {
      const line& l = seg.lines.at(j);
      for (int k = 0;  k < SIZE(l.words);  ++k) {
        const word& w = l.words.at(k);
        for (map<string, uint32_t>::iterator p = Operand_bound.begin();  p != Operand_bound.end();  ++p)
          if (has_metadata(w, p->first))
            raise << w.original << ": metadata " << p->first << " is only allowed in the (first) code segment\n" << end();
      }
    }
  }
}