(toppers-users 4582) Re: cfg/pass1.rbでの空行の扱い

Hiroaki TAKADA hiro @ ertl.jp
2016年 8月 1日 (月) 16:14:56 JST


加藤様
Cc: 皆様

先日ご指摘いただいた件,ほぼご提案通り(エラーメッセージの出し方を
少し修正しましたが),取り込ませていただきました。

カーネルの次のリリース時に同梱する形でリリースさせていただく予定で
す。

# TOPPERSプロジェクト会員は,svnから取りだしてもらうことも可能です。

あらためてご指摘にお礼申し上げます。

高田広章
名古屋大学

On 2016/07/22 0:07, Takeharu KATO wrote:
> 高田先生
> 皆様
>
> 加藤です。
>
> お世話になっております。
>
> 修正の御検討いただけるとのことありがとうございます。
>
>> 値取得シンボルテーブルは,ポーティングする人が記述するファイルで,
> そうですね。
>
> 実は, aarch64技術習得のため、aarch64向けにポーティングを行っていた中で
> 遭遇した問題でしたので, 不具合というのか仕様外の動作なのか少し悩みました。
>
> QEmuのaarch64システムシミュレータ上で動作し始めましたので,
> ソースと動作の様子を記録した動画を参考までに以下に置いています。
>
> 現状, コア/チップ/ターゲット依存部の分離, コメントなどソースの
> 整理、未使用コードの削除などの残件も残っている状況です。
>
> 既に公式にaarch64対応を開始しておられるかもしれませんが,
> ご興味をお持ちの方のお役に立てれば幸いです。>皆様
>
> 動作の様子:
> https://www.youtube.com/watch?v=-VH_JOxVme8
>
> ソースコード:
> https://github.com/takeharukato/asp3-aarch64
>
> 現在、TOPPERSのコンテストが開催(募集)されているとお聞きしましたので,
> 可能でしたら提出させていただきたいとも考えています。
>
>
> 以上
>
> On 2016/07/21 8:08, Hiroaki TAKADA wrote:
>> 加藤様
>> Cc: 皆様
>>
>> 不具合の報告,ありがとうございます。
>>
>> 値取得シンボルテーブルは,ポーティングする人が記述するファイルで,
>> 一般のユーザが記述するファイルではないものですから,エラー処理を
>> まじめにやっていませんでした。
>>
>> お送り下さった修正案を参考に修正を検討したいと思いますし(変数名
>> の間違いは明らかな不具合ですね)。
>>
>> 高田広章
>> 名古屋大学
>>
>> (16/07/20 23:59), Takeharu KATO wrote:
>>> 加藤と申します。
>>>
>>> 初めてメールさせていただきます。
>>>
>>> TOPPERS/ASP3のコンフィグレータでの値取得シンボルテーブルに空行があった場合、
>>> コンフィグレータが異常終了する問題(?)を検出しましたのでご報告いたします。
>>>
>>> つきましては、修正案を提出させていただきますので、空行を含むシンボルテーブル
>>> ファイルを扱えるように修正をお願できませんでしょうか?
>>>
>>> 現象を確認したコンフィグレータのバージョンは, TOPPERS第3世代カーネル向け
>>> Ruby版コンフィギュレータ(cfg)1.2.1になります。
>>>
>>> [現象]
>>> コンフィグレータの値取得シンボルテーブル(arch/arm_gcc/common/core_sym.defなど)
>>> に空行があった場合, カーネルのコンパイル時にコンフィグレータが以下の
>>> エラーメッセージとともに異常終了します(ファイルパス中のユーザディレクトリ名
>>> 部分は削除しています)。
>>>
>>> asp3/cfg/pass1.rb:174:in `block (2 levels) in ReadSymvalTable': undefined local variable or method `fileName' for main:Object (NameError)
>>>          from /usr/share/ruby/csv.rb:1719:in `each'
>>>          from cfg/pass1.rb:171:in `block in ReadSymvalTable'
>>>          from cfg/pass1.rb:164:in `each'
>>>          from cfg/pass1.rb:164:in `ReadSymvalTable'
>>>          from cfg/pass1.rb:864:in `Pass1'
>>>          from ../cfg/cfg.rb:686:in `<main>'
>>> make[1]: *** [cfg1_out.timestamp] エラー 1
>>>
>>> [再現手順]
>>> カーネルコンパイル時に以下の1), 2)の手順を実施する
>>>
>>> 1) arch/arm_gcc/common/core_sym.defなどの値取得シンボルテーブル中に空行を含める
>>> 2) make clean; make を実行する
>>>
>>> [原因]
>>> cfg/pass1.rb 174行目の ReadSymvalTable関数内のエラー終了処理(error_exit)呼出部分から
>>> 参照する変数の名前が誤っていた。
>>>
>>> 誤: fileName
>>> 正: symvalTableFileName
>>>
>>> [対処案]
>>> 以下の修正により, 空行や一般的なCSVコメント行(#で開始される行)を含むシンボルテーブルを
>>> 読み込んだ場合, 空行やコメント行を読み飛ばすようにする。
>>>
>>> 1) cfg/pass1.rb 174行目の ReadSymvalTable関数内のエラー終了処理から参照される変数名を
>>>     修正
>>>
>>> かつ
>>>
>>> 2) シンボルテーブルファイルをオープンする際に, ブランク行の読み飛ばし指示とコメント行定義を
>>>     付与してファイルを開くよう修正する
>>>
>>> [修正パッチ案]
>>> 上記対処案にしたがった修正案を以下に示します。
>>>
>>> diff --git a/cfg/pass1.rb b/cfg/pass1.rb
>>> index 141c7f5..9332b58 100644
>>> --- a/cfg/pass1.rb
>>> +++ b/cfg/pass1.rb
>>> @@ -167,11 +167,11 @@ def ReadSymvalTable
>>>         next
>>>       end
>>>
>>> -    symvalCsv = CSV.open(symvalTableFileName)
>>> +    symvalCsv = CSV.open(symvalTableFileName, {skip_blanks: true, skip_lines: /^#/})
>>>       symvalCsv.each do |record|
>>>         # 変数名
>>>         if record[0].nil?
>>> -        error_exit("invalid variable name in `#{fileName}'")
>>> +        error_exit("invalid variable name in ``#{symvalTableFileName}' at line: #{$.}")
>>>         end
>>>
>>>         symbol = {}
>>>
>>>
>>> 以上、ご検討いただきますようよろしくお願いいたします。
>>>
>