📄 tmodule.c
字号:
target_thread[thread].referent =
(void *) externals[obj_index_external()];
break;
When 3:
target_thread[thread].referent =
(void *) (Bit_32(*obj_ptr.b16++) ShiftedLeft 4);
Otherwise:
target_thread[thread].referent = Null;
break;
EndCase;
Else /* This is a frame thread */
frame_thread[thread].method = Bit_8(method);
frame_thread[thread].thread_defined = True;
Using method
BeginCase
When 0:
frame_thread[thread].referent =
(void *) snames[obj_index_segment()];
break;
When 1:
frame_thread[thread].referent =
(void *) gnames[obj_index_group()];
break;
When 2:
frame_thread[thread].referent =
(void *) externals[obj_index_external()];
break;
When 3:
frame_thread[thread].referent =
(void *) (Bit_32(*obj_ptr.b16++) ShiftedLeft 4);
Otherwise:
frame_thread[thread].referent = Null;
break;
EndCase;
EndIf;
return;
EndCode
/*+-------------------------------------------------------------------------+
| |
| obj_FORREF |
| |
+-------------------------------------------------------------------------+*/
bit_16 obj_FORREF()
BeginDeclarations
bit_16 len;
bit_16 segment_index;
EndDeclarations
BeginCode
If Current_record_header.rec_typ IsNot FORREF_record
Then
return(False);
EndIf;
segment_index = obj_index_segment();
len = Current_record_header.rec_len - 2;
If segment_index Exceeds 127
Then
len--;
EndIf;
write_temp_file(Current_record_header.rec_typ,
snames[segment_index],
0,
BytePtr(obj_ptr.b8),
len);
obj_next_record();
return(True);
EndCode
/*+-------------------------------------------------------------------------+
| |
| obj_generate_segment |
| |
+-------------------------------------------------------------------------+*/
lseg_ptr obj_generate_segment(lname_entry_ptr segment_lname,
lname_entry_ptr class_lname,
combine_type combine,
bit_8 align,
lname_entry_ptr tmodule,
file_info_ptr file,
bit_32 address,
bit_32 length)
BeginDeclarations
lseg_ptr lseg;
#define Lseg (*lseg)
segment_entry_ptr seg;
#define Seg (*seg)
EndDeclarations
BeginCode
If combine Is stack_combine
Then
length += AlignmentGap(length, 1L); /* Stacks should be an integral
number of words. */
EndIf;
seg = lookup_segment(segment_lname, class_lname, combine);
If (combine IsNot common_combine) OrIf (Seg.lsegs.first IsNull)
Then
Seg.address = address;
Seg.length += length;
lseg = (lseg_ptr)
allocate_memory(Addr(static_pool),
Bit_32(sizeof(lseg_type)));
Lseg.segment = seg;
Lseg.tmodule = tmodule;
Lseg.file = file;
Lseg.address = address;
Lseg.length = length;
Lseg.align = align;
If (combine IsNot common_combine) AndIf
(combine IsNot blank_common_combine)
Then /* Don't allocate common data yet. (We will wait until we
know how long the common block will be.) */
Lseg.data = allocate_memory(Addr(static_pool), length);
EndIf;
Lseg.highest_uninitialized_byte = 0L;
Insert lseg AtEnd InList Seg.lsegs EndInsert;
Else /* Not the first occurrence of this common */
lseg = Seg.lsegs.first;
If length Exceeds Seg.length
Then /* Expand common block to be big enough to hold this entry. */
Seg.length =
Lseg.length = length;
EndIf;
If align Exceeds Lseg.align
Then /* Align to largest boundary. */
Lseg.align = align;
EndIf;
EndIf;
If Seg.combine Is stack_combine
Then
If Not stack_segment_found
Then
largest_stack_seg = seg;
largest_stack_seg_length = Seg.length;
stack_segment_found = True;
Else
If Seg.length Exceeds largest_stack_seg_length
Then
largest_stack_seg = seg;
largest_stack_seg_length = Seg.length;
EndIf;
EndIf;
EndIf;
return(lseg);
EndCode
#undef Lseg
#undef Seg
/*+-------------------------------------------------------------------------+
| |
| obj_GRPDEF |
| |
+-------------------------------------------------------------------------+*/
bit_16 obj_GRPDEF()
BeginDeclarations
group_entry_ptr group;
#define Group (*group)
bit_16 group_index;
lseg_ptr lseg;
#define Lseg (*lseg)
segment_entry_ptr seg;
#define Seg (*seg)
bit_16 segment_index;
EndDeclarations
BeginCode
If Current_record_header.rec_typ IsNot GRPDEF_record
Then
return(False);
EndIf;
group_index = obj_index_LNAME();
group = lookup_group(lnames[group_index]);
If n_groups NotLessThan max_groups.val
Then
linker_error(12, "Internal limit exceeded:\n"
"\tModule: \"%Fs\"\n"
"\t File: \"%Fs\"\n"
"\tOffset: %lu\n"
"\t Error: Too many GRPDEFs. Max of %u exceeded.\n"
"\t Retry with larger \"/maxgroups:n\" switch.\n",
(*tmodule_name).symbol,
(*infile.file_info).filename,
current_record_offset,
max_groups.val);
EndIf;
gnames[++n_groups] = group;
While obj_ptr.b8 IsNot end_of_record.b8
BeginWhile
If *obj_ptr.b8++ IsNot 0xFF
Then
linker_error(12, "Translator error:\n"
"\tModule: \"%Fs\"\n"
"\t File: \"%Fs\"\n"
"\tOffset: %lu\n"
"\t Error: GRPDEF record has a group component "
"descriptor which\n"
"\t does not start with 0xFF.\n",
(*tmodule_name).symbol,
(*infile.file_info).filename,
current_record_offset);
EndIf;
segment_index = obj_index_segment();
lseg = snames[segment_index];
seg = Lseg.segment;
If Seg.owning_group IsNull
Then
Seg.owning_group = group;
Else
If Seg.owning_group IsNot group
Then
linker_error(4, "Attempt to place segment \"%Fs\" into group \"%Fs\"\n"
"\twhen it is already in group \"%Fs\".\n"
"\tRequest to place in group \"%Fs\" ignored.\n",
(*Seg.segment_name).symbol, (*Group.group_name).symbol,
(*(*Seg.owning_group).group_name).symbol,
(*Group.group_name).symbol);
EndIf;
EndIf;
EndWhile;
obj_next_record();
return(True);
EndCode
#undef Seg
#undef Group
#undef Lseg
/*+-------------------------------------------------------------------------+
| |
| obj_index_external |
| |
+-------------------------------------------------------------------------+*/
bit_16 obj_index_external()
BeginDeclarations
bit_16 index;
EndDeclarations
BeginCode
If *obj_ptr.b8 LessThan 128
Then
index = Bit_16(*obj_ptr.b8++);
Else
index = (Bit_16(*obj_ptr.b8++ - 128) ShiftedLeft 8) +
Bit_16(*obj_ptr.b8++);
EndIf;
If index Exceeds n_externals
Then
linker_error(12, "Translator error:\n"
"\tModule: \"%Fs\"\n"
"\t File: \"%Fs\"\n"
"\tOffset: %lu\n"
"\t Error: Invalid external index (%u) with only %u "
"externals defined.\n",
(*tmodule_name).symbol,
(*infile.file_info).filename,
current_record_offset,
index, n_externals);
EndIf;
return(index);
EndCode
/*+-------------------------------------------------------------------------+
| |
| obj_index_group |
| |
+-------------------------------------------------------------------------+*/
bit_16 obj_index_group()
BeginDeclarations
bit_16 index;
EndDeclarations
BeginCode
If *obj_ptr.b8 LessThan 128
Then
index = Bit_16(*obj_ptr.b8++);
Else
index = (Bit_16(*obj_ptr.b8++ - 128) ShiftedLeft 8) +
Bit_16(*obj_ptr.b8++);
EndIf;
If index Exceeds n_groups
Then
linker_error(12, "Translator error:\n"
"\tModule: \"%Fs\"\n"
"\t File: \"%Fs\"\n"
"\tOffset: %lu\n"
"\t Error: Invalid group index (%u) with only %u "
"groups defined.\n",
(*tmodule_name).symbol,
(*infile.file_info).filename,
current_record_offset,
index, n_groups);
EndIf;
return(index);
EndCode
/*+-------------------------------------------------------------------------+
| |
| obj_index_LNAME |
| |
+-------------------------------------------------------------------------+*/
bit_16 obj_index_LNAME()
BeginDeclarations
bit_16 index;
EndDeclarations
BeginCode
If *obj_ptr.b8 LessThan 128
Then
index = Bit_16(*obj_ptr.b8++);
Else
index = (Bit_16(*obj_ptr.b8++ - 128) ShiftedLeft 8) +
Bit_16(*obj_ptr.b8++);
EndIf;
If index Exceeds n_lnames
Then
linker_error(12, "Translator error:\n"
"\tModule: \"%Fs\"\n"
"\t File: \"%Fs\"\n"
"\tOffset: %lu\n"
"\t Error: Invalid LNAME index (%u) with only %u "
"LNAMEs defined.\n",
(*tmodule_name).symbol,
(*infile.file_info).filename,
current_record_offset,
index, n_lnames);
EndIf;
return(index);
EndCode
/*+-------------------------------------------------------------------------+
| |
| obj_index_segment |
| |
+-------------------------------------------------------------------------+*/
bit_16 obj_index_segment()
BeginDeclarations
bit_16 index;
EndDeclarations
BeginCode
If *obj_ptr.b8 LessThan 128
Then
index = Bit_16(*obj_ptr.b8++);
Else
index = (Bit_16(*obj_ptr.b8++ - 128) ShiftedLeft 8) +
Bit_16(*obj_ptr.b8++);
EndIf;
If index Exceeds n_segments
Then
linker_error(12, "Translator error:\n"
"\tModule: \"%Fs\"\n"
"\t File: \"%Fs\"\n"
"\tOffset: %lu\n"
"\t Error: Invalid segment index (%u) with only %u "
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -