@@ -208,6 +208,10 @@ func Parse(argList []string) ParserResult {
208208 "-mno-avx2" : {0 , pr .compileUnaryCallback },
209209 "-mno-red-zone" : {0 , pr .compileUnaryCallback },
210210 "-mmmx" : {0 , pr .compileUnaryCallback },
211+ "-mbmi" : {0 , pr .compileUnaryCallback },
212+ "-mbmi2" : {0 , pr .compileUnaryCallback },
213+ "-mf161c" : {0 , pr .compileUnaryCallback },
214+ "-mfma" : {0 , pr .compileUnaryCallback },
211215 "-mno-mmx" : {0 , pr .compileUnaryCallback },
212216 "-mno-global-merge" : {0 , pr .compileUnaryCallback }, //iam: linux kernel stuff
213217 "-mno-80387" : {0 , pr .compileUnaryCallback }, //iam: linux kernel stuff
@@ -290,6 +294,7 @@ func Parse(argList []string) ParserResult {
290294 "-gdwarf-4" : {0 , pr .compileUnaryCallback },
291295 "-gline-tables-only" : {0 , pr .compileUnaryCallback },
292296 "-grecord-gcc-switches" : {0 , pr .compileUnaryCallback },
297+ "-ggnu-pubnames" : {0 , pr .compileUnaryCallback },
293298
294299 "-p" : {0 , pr .compileUnaryCallback },
295300 "-pg" : {0 , pr .compileUnaryCallback },
@@ -364,7 +369,7 @@ func Parse(argList []string) ParserResult {
364369 {`^-W[^l].*$` , flagInfo {0 , pr .compileUnaryCallback }},
365370 {`^-W[l][^,].*$` , flagInfo {0 , pr .compileUnaryCallback }}, //iam: tor has a few -Wl...
366371 {`^-fsanitize=.+$` , flagInfo {0 , pr .compileLinkUnaryCallback }},
367- {`^-fuse-ld=.+$` , flagInfo {0 , pr .linkUnaryCallback }}, //iam: musl stuff
372+ {`^-fuse-ld=.+$` , flagInfo {0 , pr .linkUnaryCallback }}, //iam: musl stuff
368373 {`^-flto=.+$` , flagInfo {0 , pr .linkTimeOptimizationCallback }}, //iam: new lto stuff
369374 {`^-f.+$` , flagInfo {0 , pr .compileUnaryCallback }},
370375 {`^-rtlib=.+$` , flagInfo {0 , pr .linkUnaryCallback }},
@@ -391,32 +396,53 @@ func Parse(argList []string) ParserResult {
391396 if fi , ok := argsExactMatches [elem ]; ok {
392397 fi .handler (elem , argList [1 :1 + fi .arity ])
393398 argList = argList [1 + fi .arity :]
394- // Else try to match a pattern
399+ // else it is more complicated, either a pattern or a group
395400 } else {
396401 var listShift = 0
397- var matched = false
398-
399- for _ , argPat := range argPatterns {
400- pattern := argPat .pattern
401- fi := argPat .finfo
402- var regExp = regexp .MustCompile (pattern )
403- if regExp .MatchString (elem ) {
404- fi .handler (elem , argList [1 :1 + fi .arity ])
405- listShift = fi .arity
406- matched = true
407- break
402+ //need to handle the N-ary grouping flag
403+ if elem == "-Wl,--start-group" {
404+ endgroup := indexOf ("-Wl,--end-group" , argList )
405+ if endgroup > 0 {
406+ pr .linkerGroupCallback (elem , endgroup + 1 , argList )
407+ listShift = endgroup
408+ } else {
409+ LogWarning ("Failed to find '-Wl,--end-group' matching '-Wl,--start-group'\n " )
410+ pr .compileUnaryCallback (elem , argList [1 :1 ])
411+ }
412+ //else try to match a pattern
413+ } else {
414+ var matched = false
415+ for _ , argPat := range argPatterns {
416+ pattern := argPat .pattern
417+ fi := argPat .finfo
418+ var regExp = regexp .MustCompile (pattern )
419+ if regExp .MatchString (elem ) {
420+ fi .handler (elem , argList [1 :1 + fi .arity ])
421+ listShift = fi .arity
422+ matched = true
423+ break
424+ }
425+ }
426+ if ! matched {
427+ LogWarning ("Did not recognize the compiler flag: %v\n " , elem )
428+ pr .compileUnaryCallback (elem , argList [1 :1 ])
408429 }
409- }
410- if ! matched {
411- LogWarning ("Did not recognize the compiler flag: %v\n " , elem )
412- pr .compileUnaryCallback (elem , argList [1 :1 ])
413430 }
414431 argList = argList [1 + listShift :]
415432 }
416433 }
417434 return pr
418435}
419436
437+ func indexOf (value string , slice []string ) int {
438+ for p , v := range slice {
439+ if v == value {
440+ return p
441+ }
442+ }
443+ return - 1
444+ }
445+
420446// Return the object and bc filenames that correspond to the i-th source file
421447func getArtifactNames (pr ParserResult , srcFileIndex int , hidden bool ) (objBase string , bcBase string ) {
422448 if len (pr .InputFiles ) == 1 && pr .IsCompileOnly && len (pr .OutputFilename ) > 0 {
@@ -470,6 +496,11 @@ func (pr *ParserResult) objectFileCallback(flag string, _ []string) {
470496 pr .LinkArgs = append (pr .LinkArgs , flag )
471497}
472498
499+ func (pr * ParserResult ) linkerGroupCallback (start string , count int , args []string ) {
500+ group := args [0 :count ]
501+ pr .LinkArgs = append (pr .LinkArgs , group ... )
502+ }
503+
473504func (pr * ParserResult ) preprocessOnlyCallback (_ string , _ []string ) {
474505 pr .IsPreprocessOnly = true
475506}
0 commit comments