As per suggestion we should use g0 for turning off debug information in the compiled go file.
I did some preparatory work in case we will add more levels in the future as well. See diff attached. >>>>>>>>>>>>>>>>>>>>< stis@lapwine:~/guile-work$ guile/meta/guild compile --help Usage: compile [OPTION] FILE... Compile each Guile source file FILE into a Guile object. -h, --help print this help message -L, --load-path=DIR add DIR to the front of the module load path -o, --output=OFILE write output to OFILE -W, --warn=WARNING emit warnings of type WARNING; use `--warn=help' for a list of available warnings -O, --optimize=OPT specify optimization passes to run; use `-Ohelp' for a list of available optimizations -g, --debug=OPT specify debug information availability; use `-ghelp ' for a list of available debug options -f, --from=LANG specify a source language other than `scheme' -t, --to=LANG specify a target language other than `bytecode' -T, --target=TRIPLET produce bytecode for host TRIPLET Note that auto-compilation will be turned off. Report bugs to <bug-gu...@gnu.org>. >>>>>>>>>>>>>>>>>> stis@lapwine:~/guile-work$ guile/meta/guild compile -g0 test.scm wrote `/home/stis/guile-work/guile/cache/guile/ccache/2.2-LE-8-3.A/home/st is/guile-work/test.scm.go' stis@lapwine:~/guile-work$ objdump -h ~/guile-work/guile/cache/guile/ccach e/2.2-LE-8-3.A/home/stis/guile-work/test.scm.go /home/stis/guile-work/guile/cache/guile/ccache/2.2-LE-8-3.A/home/stis/guil e-work/test.scm.go: file format elf64-little Sections: Idx Name Size VMA LMA File off Algn 0 .guile.procprops 00000000 0000000000000000 0000000000000000 0001041 8 2**3 CONTENTS, READONLY 1 .rodata 00000013 0000000000000138 0000000000000138 00000138 2**3 CONTENTS, ALLOC, LOAD, READONLY, DATA 2 .data 00000028 0000000000010000 0000000000010000 00010000 2**3 CONTENTS, ALLOC, LOAD, DATA 3 .rtl-text 00000050 00000000000000e8 00000000000000e8 000000e8 2**3 CONTENTS, ALLOC, LOAD, READONLY, DATA 4 .dynamic 00000060 0000000000000150 0000000000000150 00000150 2**3 CONTENTS, ALLOC, LOAD, READONLY, DATA 5 .guile.arities 0000002f 0000000000000000 0000000000000000 000103e8 2**3 CONTENTS, READONLY 6 .guile.arities.strtab 00000016 0000000000000000 0000000000000000 00 010450 2**3 CONTENTS, READONLY 7 .guile.docstrs 00000000 0000000000000000 0000000000000000 00010418 2**3 CONTENTS, READONLY 8 .guile.docstrs.strtab 00000001 0000000000000000 0000000000000000 00 010468 2**3 CONTENTS, READONLY 9 000000e8 0000000000000000 0000000000000000 00000000 2**3 CONTENTS, ALLOC, LOAD, READONLY, DATA 10 000003c0 0000000000000000 0000000000000000 00010028 2**3 CONTENTS, READONLY >>>>>>>>>>>>>>>>>>>>>>>>> stis@lapwine:~/guile-work$ guile/meta/guild compile -g1 test.scm wrote `/home/stis/guile-work/guile/cache/guile/ccache/2.2-LE-8-3.A/home/st is/guile-work/test.scm.go' stis@lapwine:~/guile-work$ objdump -h ~/guile-work/guile/cache/guile/ccach e/2.2-LE-8-3.A/home/stis/guile-work/test.scm.go /home/stis/guile-work/guile/cache/guile/ccache/2.2-LE-8-3.A/home/stis/guil e-work/test.scm.go: file format elf64-little Sections: Idx Name Size VMA LMA File off Algn 0 .guile.procprops 00000000 0000000000000000 0000000000000000 0001055 8 2**3 CONTENTS, READONLY 1 .rodata 00000013 0000000000000138 0000000000000138 00000138 2**3 CONTENTS, ALLOC, LOAD, READONLY, DATA 2 .data 00000028 0000000000010000 0000000000010000 00010000 2**3 CONTENTS, ALLOC, LOAD, DATA 3 .rtl-text 00000050 00000000000000e8 00000000000000e8 000000e8 2**3 CONTENTS, ALLOC, LOAD, READONLY, DATA 4 .dynamic 00000060 0000000000000150 0000000000000150 00000150 2**3 CONTENTS, ALLOC, LOAD, READONLY, DATA 5 .guile.arities 0000002f 0000000000000000 0000000000000000 00010528 2**3 CONTENTS, READONLY 6 .guile.arities.strtab 00000016 0000000000000000 0000000000000000 00 010640 2**3 CONTENTS, READONLY 7 .guile.docstrs 00000000 0000000000000000 0000000000000000 00010558 2**3 CONTENTS, READONLY 8 .guile.docstrs.strtab 00000001 0000000000000000 0000000000000000 00 010658 2**3 CONTENTS, READONLY 9 .debug_info 00000034 0000000000000000 0000000000000000 00010558 2**3 CONTENTS, READONLY, DEBUGGING 10 .debug_abbrev 00000019 0000000000000000 0000000000000000 00010590 2**3 CONTENTS, READONLY, DEBUGGING 11 .debug_str 00000014 0000000000000000 0000000000000000 000105b0 2**3 CONTENTS, READONLY, DEBUGGING 12 .debug_loc 00000000 0000000000000000 0000000000000000 000105c8 2**3 CONTENTS, READONLY, DEBUGGING 13 .debug_line 00000039 0000000000000000 0000000000000000 000105c8 2**3 CONTENTS, READONLY, DEBUGGING 14 000000e8 0000000000000000 0000000000000000 00000000 2**3 CONTENTS, ALLOC, LOAD, READONLY, DATA 15 00000500 0000000000000000 0000000000000000 00010028 2**3 CONTENTS, READONLY >>>>>>>>>>>>>>>>>>> stis@lapwine:~/guile-work$ guile/meta/guild compile -ghelp The available debug options are: -gdebug-info To disable an optimization, prepend it with `no-', for example `-gno-debug-info' You may also specify optimization levels as `-g0', `-g1'. Currently `-g0' removes debug info from the compiled file and remove all debug information, `-g1' have all debug info inserted in the compiled file. The default is equivalent to `-g1'. On Fri, May 19, 2017 at 11:52 PM, Stefan Israelsson Tampe < stefan.ita...@gmail.com> wrote: > Hi, > > I have now tested to compile a scm file with -O0, checked with objdump > that the dwarf information is gone and than load it and all seams fine. > > diff is attached to this email > > On Fri, May 19, 2017 at 9:10 PM, Stefan Israelsson Tampe < > stefan.ita...@gmail.com> wrote: > >> I found a bug in the call-with-values part of the diff. That is fixed now >> >> On Fri, May 19, 2017 at 8:48 PM, Stefan Israelsson Tampe < >> stefan.ita...@gmail.com> wrote: >> >>> I manage to send the mail to fast. Here is the diff >>> >>> On Fri, May 19, 2017 at 8:46 PM, Stefan Israelsson Tampe < >>> stefan.ita...@gmail.com> wrote: >>> >>>> Hi, >>>> >>>> I've decided to start help developing guile. wingo has a list at >>>> >>>> https://wingolog.org/archives/2016/02/04/guile-compiler-tasks >>>> >>>> I took, as a start, the first item: stripping binaries. >>>> >>>> one can remove debug information through >>>> guild compile -O0 >>>> >>>> After some thought I think that the diff following this email adresses >>>> this, any comments are >>>> helpful else I will compile and start testing this option >>>> >>> >>> >> >
diff --git a/module/language/cps/compile-bytecode.scm b/module/language/cps/compile-bytecode.scm index c283eb6..b6d4bf7 100644 --- a/module/language/cps/compile-bytecode.scm +++ b/module/language/cps/compile-bytecode.scm @@ -587,7 +587,9 @@ (intmap-for-each (lambda (kfun body) (compile-function (intmap-select exp body) asm)) (compute-reachable-functions exp 0)) - (values (link-assembly asm #:page-aligned? (kw-arg-ref opts #:to-file? #f)) + (values (link-assembly asm + #:page-aligned? (kw-arg-ref opts #:to-file? #f) + #:debug? (kw-arg-ref opts #:debug-info? #t)) env env))) diff --git a/module/scripts/compile.scm b/module/scripts/compile.scm index 939fb25..ff20bca 100644 --- a/module/scripts/compile.scm +++ b/module/scripts/compile.scm @@ -42,6 +42,7 @@ #:export (compile)) (define %summary "Compile a file.") +(define debug-options '(#:debug-info? #t)) (define (fail . messages) @@ -116,6 +117,28 @@ (return-option (substring arg 3) #f)) (else (return-option arg #t))))) + + (option '(#\g "debug") #t #f + (lambda (opt name arg result) + (define (return val) + (alist-cons 'debug val result)) + (define (return-option name val) + (let ((kw (symbol->keyword + (string->symbol (string-append name "?"))))) + (unless (memq kw debug-options) + (fail "Unknown debug option `~a'" name)) + (return (list kw val)))) + (cond + ((string=? arg "help") + (show-debug-help) + (exit 0)) + ((equal? arg "0") (return '(#:debug-info? #f))) + ((equal? arg "1") (return '(#:debug-info? #t))) + ((string-prefix? "no-" arg) + (return-option (substring arg 3) #f)) + (else + (return-option arg #t))))) + (option '(#\f "from") #t #f (lambda (opt name arg result) (if (assoc-ref result 'from) @@ -185,6 +208,27 @@ There is NO WARRANTY, to the extent permitted by law.~%")) (format #t "everything. The default is equivalent to `-O2'.") (format #t "~%")) +(define (show-debug-help) + (format #t "The available debug options are:~%~%") + (let lp ((options debug-options)) + (match options + (() #t) + ((kw val . options) + (let ((name (string-trim-right (symbol->string (keyword->symbol kw)) + #\?))) + (format #t " -g~a~%" + (if val name (string-append "no-" name))) + (lp options))))) + (format #t "~%") + (format #t "To disable an debug info level, prepend it with `no-', for example~%") + (format #t "`-gno-debug-info'~%~%") + (format #t "You may also specify debug levels as `-g0', `-g1'.~%") + (format #t "Currently `-g0' removes debug info from the compiled file~%") + (format #t "and remove all debug information,~%") + (format #t "`-g1' have all debug info inserted in the compiled file.~%") + (format #t "The default is equivalent to `-g1'.") + (format #t "~%")) + (define (compile . args) (let* ((options (parse-args args)) @@ -195,6 +239,7 @@ There is NO WARRANTY, to the extent permitted by law.~%")) (lambda (opt) (match opt (('optimizations . opts) opts) + (('debug . opts) opts) (_ '()))) options))) (from (or (assoc-ref options 'from) 'scheme)) @@ -217,7 +262,8 @@ Compile each Guile source file FILE into a Guile object. for a list of available warnings -O, --optimize=OPT specify optimization passes to run; use `-Ohelp' for a list of available optimizations - + -g, --debug=OPT specify debug information availability; use `-ghelp' + for a list of available debug options -f, --from=LANG specify a source language other than `scheme' -t, --to=LANG specify a target language other than `bytecode' -T, --target=TRIPLET produce bytecode for host TRIPLET diff --git a/module/system/vm/assembler.scm b/module/system/vm/assembler.scm index 8d71dc5..bf96d3b 100644 --- a/module/system/vm/assembler.scm +++ b/module/system/vm/assembler.scm @@ -2194,7 +2194,7 @@ procedure with label @var{rw-init}. @var{rw-init} may be false. If ;; The size of a procprops entry, in bytes. (define procprops-size 8) - + (define (link-procprops asm) (define (assoc-remove-one alist key value-pred) (match alist @@ -2575,7 +2575,7 @@ procedure with label @var{rw-init}. @var{rw-init} may be false. If (make-object asm '.debug_line bv line-relocs '() #:type SHT_PROGBITS #:flags 0))))) -(define (link-objects asm) +(define* (link-objects asm debug?) (let*-values (;; Link procprops before constants, because it probably ;; interns more constants. ((procprops) (link-procprops asm)) @@ -2588,16 +2588,21 @@ procedure with label @var{rw-init}. @var{rw-init} may be false. If ((symtab strtab) (link-symtab (linker-object-section text) asm)) ((arities arities-strtab) (link-arities asm)) ((docstrs docstrs-strtab) (link-docstrs asm)) - ((dinfo dabbrev dstrtab dloc dline) (link-debug asm)) + ((debug-tables) + (values + (if debug? + (call-with-values (lambda () (link-debug asm)) list) + '()))) ;; This needs to be linked last, because linking other ;; sections adds entries to the string table. ((shstrtab) (link-shstrtab asm))) (filter identity - (list text ro frame-maps rw dt symtab strtab - arities arities-strtab - docstrs docstrs-strtab procprops - dinfo dabbrev dstrtab dloc dline - shstrtab)))) + (append + (list text ro frame-maps rw dt symtab strtab + arities arities-strtab + docstrs docstrs-strtab procprops) + debug-tables + (list shstrtab))))) @@ -2606,9 +2611,10 @@ procedure with label @var{rw-init}. @var{rw-init} may be false. If ;;; High-level public interfaces. ;;; -(define* (link-assembly asm #:key (page-aligned? #t)) +(define* (link-assembly asm #:key (page-aligned? #t) (debug? #t)) "Produce an ELF image from the code and data emitted into @var{asm}. The result is a bytevector, by default linked so that read-only and writable data are on separate pages. Pass @code{#:page-aligned? #f} to -disable this behavior." - (link-elf (link-objects asm) #:page-aligned? page-aligned?)) +disable this behavior. Pass @code{debug? #f} to remove debug info from +the elf image" + (link-elf (link-objects asm debug?) #:page-aligned? page-aligned?))