fdvmDDr (1158419), страница 2
Текст из файла (страница 2)
| a | ... | b | ... | c | ... | ||||||||||||||||||||
Таблица символов
Рис. 4.4. Внутреннее представление оператора a = b + c.
5Детальное описание модулей компилятора
5.1Трансляция конструкций языка Fortran DVM (модуль dvm.cpp)
Ниже представлена схема вызова функций верхнего уровня модуля dvm.cpp :
m
ain initialize
initVariantNames
initLibNames
initDVM
TranslateFileDVM • TransFunc
unparse (class File) InsertDebugStat
| int main ( | int | argc, |
Функция обрабатывает параметры компиляции и устанавливает режимы компиляции. Она инициализирует структуры данных компилятора, реструктурирует дерево разбора в соответствии с режимами компиляции, вызывая для этого функцию TranslateFileDVM( ), и генерирует новый код на Фортране 77 по реструктурированному внутреннему представлению с помощью функции unparse( ) класса SgFile. Функция возвращает 1, если в программе обнаружены ошибки.
void TranslateFileDVM ( SgFile *f )
| f | - указатель на программный файл |
Если требуется сгенерировать параллельную программу (опция –p), тогда вызывается функция TransFunc( ) , иначе вызывается функция InsertDebugStat( ).
void TransFunc ( SgStatement *func )
| func | - указатель на заголовок процедуры |
Сканирует операторы процедуры в лексическом порядке, пока не встретится последний оператор процедуры.
Обработка операторов и директив спецификации.
Директивы DISTRIBUTE включаются в список. Строятся деревья выравнивания, когда обрабатываются директивы ALIGN.
При сканировании операторов и директив спецификации, генерируются обращения к функциям системы поддержки Lib-DVM для создания распределенных массивов, которые вставляются в процедуру перед первым исполняемым оператором. Функция GenDistArray( ) создает распределенный массив (объект Lib-DVM ) для массива с атрибутом DISTRIBUTE, а также для всех массивов, непосредственно или косвенно выровненных на него.
Обработка исполняемых операторов и директив.
Все ссылки на элементы распределенных массивов в операторах присваивания, CALL , арифметический IF, логический IF, IF-THEN, ELSE_IF и вычисляемый GOTO линеаризуются.
Директива DVM заменяется последовательностью вызовов функций системы поддержки Lib-DVM. Когда новый оператор вставляется в программу, выполняется, если это необходимо, реструктурирование графа управления (перемещение или замена меток, замена оператора логический IF конструкцией IF...THEN...ENDIF и т.п.). Функции ReplaceContext( ), doAssignStmtAfter( ), InsertNewStatementAfter( ), InserNewStatementBefore( ) предназначены для включения новых операторов в дерево разбора и его реструктурирования.
После обработки последнего оператора процедуры, создаются операторы объявления служебных переменных, которые используются для передачи аргументов и запоминания значения функций, буферизации ввода-вывода и адресации распределенных массивов. Они включаются в ту часть процедуры, где расположены спецификации (DeclareVarDVM( )).
Список вызываемых функций:
| TempVarDVM | ChangeDistArrayRef |
| DeclareVarDVM | ChangeDistArrayRef_Left |
| RTLInit | DebugVarArrayRef |
| RTLExit | DebugVarArrayRef_Left |
| BeginBlock | ChangeArg_DistArrayRef |
| EndBlock | DebugArg_VarArrayRef |
| GetAM | ReplaceAssignByIf |
| GetVM | ReplaceContext |
| doDisRuleArrays | ParallelLoop |
| GenDistArray | AddToGroupNameList |
| GenAlignArray | AllocateArray |
| AlignTree | AssignPointer |
| InsertNewStatementBefore | CreateBoundGroup |
| InsertNewStatementAfter | ShadowList |
| doAssignStmt | Calculate |
| doAssignStmtAfter | hasNewValueClause |
| doAssignTo_After | StartBound |
| Extract_Stmt | WaitBound |
| ContinueWithLabel | SendBoun |
| RemoteAccessEnd | CreateReductionGroup |
| GoRoundEntry | ReductionList |
| BeginBLockForEntry | StartRed |
| initMask | WaitRed |
| ReplaceDoLabel | ReductionVarsStart |
| Error | doAlignRule |
| err | RealignArray |
| addToStmtList | RealignArr |
| ReplaceDoNestLabel_Above | DistObjectRef |
| CloseDoInParLoop | RedistributeArray |
| CloseParLoop | control_list_open |
| EndParLoop | ReplaceByIfStmt |
| EndPl | InsertSendIOSTAT |
| isDoEndStmt | InsertSendInquire |
| CloseLoop | InsertSendInputList |
| DebugLoop | IOcontrol |
| SeqLoopBegin | TestIOList |
| SeqLoopEndInParLoop | IO_ThroughBuffer |
| OverLoopAnalyze | D_Skpbl |
| SeqLoopEnd | D_Lnumb |
| DeleteObject | D_Fname |
| OpenInterval | St_Binter |
| CloseInterval | St_Einter |
| Value | St_Biof |
| lastStmtOfDo | St_Eiof |
| AddRemoteAccess | St_Eloop |
| RemoteVariableList | BeginDebugFragment |
| RankOfSection | EndDebugFragment |
| Rank | ArrayHeader |
| isListOfArrays | TypeControl |
| ReconfPS | CreateTaskArray |
| InitGroups | SetDoVar |
| InitHeap | PSReference |
| hasOntoClause | SearchDistArrayRef |
| DebugTaskRegion | CloseTaskRegion |
| StartTask | isParallelLoopEndStmt |
| StopAM | CreateBG |
| doIfThenConstrForPrefetch | LoadBg |
| InitRemoteGroups | IsLIFReductionOp |
| INDLoopBegin | IsReductionOp |
| IEXLoopAnalyse | OffDoVarsOfNest |
| IndependentLoop |
void InsertDebugStat ( SgStatement *func )
| func | - указатель на заголовок процедуры |
Функция генерирует последовательную программу с вызовами функций отладчика и анализатора производительности. Процессом генерации новых операторов управляют параметры компиляции (-e… и -d…).
Операторы процедуры сканируются в лексическом порядке, пока не встретится последний оператор процедуры. Операторы и директивы спецификации пропускаются.
Если пользователь указал в командной строке не нулевой уровень отладки, операторы, включающие выражения (присваивания, CALL , арифметический IF и т.п.), окружаются вызовами функций отладчика для контроля значений переменных. Функция вставляет вызовы функций отладчика в начало и конец каждого параллельного цикла и вызовы функций анализатора производительности в начало и конец каждого интервала.
Список вызываемых функций:
| TempVarDVM | DebugVarArrayRef |
| RTLInit | DebugVarArrayRef_Left |
| RTLExit | DebugArg_VarArrayRef |
| InsertNewStatementBefore | SkipParLoopNest |
| InsertNewStatementAfter | ReplaceContext |
| doAssignStmtAfter | ParallelLoop_Debug |
| Extract_Stmt | isParallelLoopEndStmt |
| addToStmtList | AddToGroupNameList |
| ReplaceDoNestLabel_Above | CreateReductionGroup |
| CloseDoInParLoop | ReductionList |
| CloseParLoop | D_Lnumb |
| isDoEndStmt | D_Fname |
| ReplaceFuncCall | D_Skpbl |
| InitRemoteGroups | D_Iter_ON |
| CloseLoop | St_Binter |
| DebugLoop | St_Einter |
| SeqLoopBegin | St_Biof |
| SeqLoopEndInParLoop | St_Eiof |
| OverLoopAnalyze | St_Eloop |
| SeqLoopEnd | DeclareVarDVM |
| OpenInterval | DeleteObject |
| CloseInterval | Error |
| Value | err |
| initMask | InitGroups |
| isLIFReductionOp | IsReductionOp |
| IEXLoopAnalyze | IndependentLoop_Debug |
| BeginDebugFragment | SkipIndepLoopNest |
| EndDebugFragment | DebugTaskRegion |
| INDReductionDebug | CloseTaskRegion |
void initialize ( )
Функция инициализирует переменные компилятора, используемые в отладочном режиме.















