Skip to content

Commit d7314dd

Browse files
committed
pattern matching done in a fixed order to make sure the right one matches first.
1 parent 6fa871f commit d7314dd

File tree

1 file changed

+91
-36
lines changed

1 file changed

+91
-36
lines changed

shared/parser.go

Lines changed: 91 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,11 @@ type flagInfo struct {
6666
handler func(string, []string)
6767
}
6868

69+
type argPattern struct {
70+
pattern string
71+
finfo flagInfo
72+
}
73+
6974
func skipBitcodeGeneration(pr parserResult) bool {
7075
if LLVMConfigureOnly != "" {
7176
return true
@@ -261,43 +266,81 @@ func parse(argList []string) parserResult {
261266
"-dead_strip": {0, pr.warningLinkUnaryCallback}, //iam: tor does this. We lose the bitcode :-(
262267
}
263268

264-
var argPatterns = map[string]flagInfo{
265-
`^.+\.(c|cc|cpp|C|cxx|i|s|S|bc)$`: {0, pr.inputFileCallback},
266-
`^.+\.([fF](|[0-9][0-9]|or|OR|pp|PP))$`: {0, pr.inputFileCallback},
267-
`^.+\.(o|lo|So|so|po|a|dylib)$`: {0, pr.objectFileCallback},
268-
`^.+\.dylib(\.\d)+$`: {0, pr.objectFileCallback},
269-
`^.+\.(So|so)(\.\d)+$`: {0, pr.objectFileCallback},
270-
`^-(l|L).+$`: {0, pr.linkUnaryCallback},
271-
`^-I.+$`: {0, pr.compileUnaryCallback},
272-
`^-D.+$`: {0, pr.compileUnaryCallback},
273-
`^-B.+$`: {0, pr.compileLinkUnaryCallback},
274-
`^-isystem.+$`: {0, pr.compileLinkUnaryCallback},
275-
`^-U.+$`: {0, pr.compileUnaryCallback},
276-
//iam: need to be careful here, not mix up linker and warning flags.
277-
`^-Wl,.+$`: {0, pr.linkUnaryCallback},
278-
`^-W[^l].*$`: {0, pr.compileUnaryCallback},
279-
`^-W[l][^,].*$`: {0, pr.compileUnaryCallback}, //iam: tor has a few -Wl...
280-
`^-fsanitize=.+$`: {0, pr.compileLinkUnaryCallback},
281-
`^-f.+$`: {0, pr.compileUnaryCallback},
282-
`^-rtlib=.+$`: {0, pr.linkUnaryCallback},
283-
`^-std=.+$`: {0, pr.compileUnaryCallback},
284-
`^-stdlib=.+$`: {0, pr.compileLinkUnaryCallback},
285-
`^-mtune=.+$`: {0, pr.compileUnaryCallback},
286-
`^--sysroot=.+$`: {0, pr.compileLinkUnaryCallback}, //both compile and link time
287-
`^-print-prog-name=.*$`: {0, pr.compileUnaryCallback},
288-
`^-print-file-name=.*$`: {0, pr.compileUnaryCallback},
289-
`^-mmacosx-version-min=.+$`: {0, pr.compileLinkUnaryCallback},
290-
`^-mstack-alignment=.+$`: {0, pr.compileUnaryCallback}, //iam: linux kernel stuff
291-
`^-march=.+$`: {0, pr.compileUnaryCallback}, //iam: linux kernel stuff
292-
`^-mregparm=.+$`: {0, pr.compileUnaryCallback}, //iam: linux kernel stuff
293-
`^-mcmodel=.+$`: {0, pr.compileUnaryCallback}, //iam: linux kernel stuff
294-
`^-mpreferred-stack-boundary=.+$`: {0, pr.compileUnaryCallback}, //iam: linux kernel stuff
295-
`^-mindirect-branch=.+$`: {0, pr.compileUnaryCallback}, //iam: linux kernel stuff
296-
`^--param=.+$`: {0, pr.compileUnaryCallback}, //iam: linux kernel stuff
297-
`^-fuse-ld=.+$`: {0, pr.linkUnaryCallback}, //iam: musl stuff
298-
269+
var argPatterns = [...]argPattern{
270+
{`^.+\.(c|cc|cpp|C|cxx|i|s|S|bc)$`, flagInfo{0, pr.inputFileCallback}},
271+
{`^.+\.([fF](|[0-9][0-9]|or|OR|pp|PP))$`, flagInfo{0, pr.inputFileCallback}},
272+
{`^.+\.(o|lo|So|so|po|a|dylib)$`, flagInfo{0, pr.objectFileCallback}},
273+
{`^.+\.dylib(\.\d)+$`, flagInfo{0, pr.objectFileCallback}},
274+
{`^.+\.(So|so)(\.\d)+$`, flagInfo{0, pr.objectFileCallback}},
275+
{`^-(l|L).+$`, flagInfo{0, pr.linkUnaryCallback}},
276+
{`^-I.+$`, flagInfo{0, pr.compileUnaryCallback}},
277+
{`^-D.+$`, flagInfo{0, pr.compileUnaryCallback}},
278+
{`^-B.+$`, flagInfo{0, pr.compileLinkUnaryCallback}},
279+
{`^-isystem.+$`, flagInfo{0, pr.compileLinkUnaryCallback}},
280+
{`^-U.+$`, flagInfo{0, pr.compileUnaryCallback}},
281+
//iam, need to be careful here, not mix up linker and warning flags.
282+
{`^-Wl,.+$`, flagInfo{0, pr.linkUnaryCallback}},
283+
{`^-W[^l].*$`, flagInfo{0, pr.compileUnaryCallback}},
284+
{`^-W[l][^,].*$`, flagInfo{0, pr.compileUnaryCallback}}, //iam: tor has a few -Wl...
285+
{`^-fsanitize=.+$`, flagInfo{0, pr.compileLinkUnaryCallback}},
286+
{`^-fuse-ld=.+$`, flagInfo{0, pr.linkUnaryCallback}}, //iam: musl stuff
287+
{`^-f.+$`, flagInfo{0, pr.compileUnaryCallback}},
288+
{`^-rtlib=.+$`, flagInfo{0, pr.linkUnaryCallback}},
289+
{`^-std=.+$`, flagInfo{0, pr.compileUnaryCallback}},
290+
{`^-stdlib=.+$`, flagInfo{0, pr.compileLinkUnaryCallback}},
291+
{`^-mtune=.+$`, flagInfo{0, pr.compileUnaryCallback}},
292+
{`^--sysroot=.+$`, flagInfo{0, pr.compileLinkUnaryCallback}}, //both compile and link time
293+
{`^-print-prog-name=.*$`, flagInfo{0, pr.compileUnaryCallback}},
294+
{`^-print-file-name=.*$`, flagInfo{0, pr.compileUnaryCallback}},
295+
{`^-mmacosx-version-min=.+$`, flagInfo{0, pr.compileLinkUnaryCallback}},
296+
{`^-mstack-alignment=.+$`, flagInfo{0, pr.compileUnaryCallback}}, //iam, linux kernel stuff
297+
{`^-march=.+$`, flagInfo{0, pr.compileUnaryCallback}}, //iam: linux kernel stuff
298+
{`^-mregparm=.+$`, flagInfo{0, pr.compileUnaryCallback}}, //iam: linux kernel stuff
299+
{`^-mcmodel=.+$`, flagInfo{0, pr.compileUnaryCallback}}, //iam: linux kernel stuff
300+
{`^-mpreferred-stack-boundary=.+$`, flagInfo{0, pr.compileUnaryCallback}}, //iam: linux kernel stuff
301+
{`^-mindirect-branch=.+$`, flagInfo{0, pr.compileUnaryCallback}}, //iam: linux kernel stuff
302+
{`^--param=.+$`, flagInfo{0, pr.compileUnaryCallback}}, //iam: linux kernel stuff
299303
}
300304

305+
/*
306+
var argPatterns = map[string]flagInfo{
307+
`^.+\.(c|cc|cpp|C|cxx|i|s|S|bc)$`: {0, pr.inputFileCallback},
308+
`^.+\.([fF](|[0-9][0-9]|or|OR|pp|PP))$`: {0, pr.inputFileCallback},
309+
`^.+\.(o|lo|So|so|po|a|dylib)$`: {0, pr.objectFileCallback},
310+
`^.+\.dylib(\.\d)+$`: {0, pr.objectFileCallback},
311+
`^.+\.(So|so)(\.\d)+$`: {0, pr.objectFileCallback},
312+
`^-(l|L).+$`: {0, pr.linkUnaryCallback},
313+
`^-I.+$`: {0, pr.compileUnaryCallback},
314+
`^-D.+$`: {0, pr.compileUnaryCallback},
315+
`^-B.+$`: {0, pr.compileLinkUnaryCallback},
316+
`^-isystem.+$`: {0, pr.compileLinkUnaryCallback},
317+
`^-U.+$`: {0, pr.compileUnaryCallback},
318+
//iam: need to be careful here, not mix up linker and warning flags.
319+
`^-Wl,.+$`: {0, pr.linkUnaryCallback},
320+
`^-W[^l].*$`: {0, pr.compileUnaryCallback},
321+
`^-W[l][^,].*$`: {0, pr.compileUnaryCallback}, //iam: tor has a few -Wl...
322+
`^-fsanitize=.+$`: {0, pr.compileLinkUnaryCallback},
323+
`^-f.+$`: {0, pr.compileUnaryCallback},
324+
`^-rtlib=.+$`: {0, pr.linkUnaryCallback},
325+
`^-std=.+$`: {0, pr.compileUnaryCallback},
326+
`^-stdlib=.+$`: {0, pr.compileLinkUnaryCallback},
327+
`^-mtune=.+$`: {0, pr.compileUnaryCallback},
328+
`^--sysroot=.+$`: {0, pr.compileLinkUnaryCallback}, //both compile and link time
329+
`^-print-prog-name=.*$`: {0, pr.compileUnaryCallback},
330+
`^-print-file-name=.*$`: {0, pr.compileUnaryCallback},
331+
`^-mmacosx-version-min=.+$`: {0, pr.compileLinkUnaryCallback},
332+
`^-mstack-alignment=.+$`: {0, pr.compileUnaryCallback}, //iam: linux kernel stuff
333+
`^-march=.+$`: {0, pr.compileUnaryCallback}, //iam: linux kernel stuff
334+
`^-mregparm=.+$`: {0, pr.compileUnaryCallback}, //iam: linux kernel stuff
335+
`^-mcmodel=.+$`: {0, pr.compileUnaryCallback}, //iam: linux kernel stuff
336+
`^-mpreferred-stack-boundary=.+$`: {0, pr.compileUnaryCallback}, //iam: linux kernel stuff
337+
`^-mindirect-branch=.+$`: {0, pr.compileUnaryCallback}, //iam: linux kernel stuff
338+
`^--param=.+$`: {0, pr.compileUnaryCallback}, //iam: linux kernel stuff
339+
`^-fuse-ld=.+$`: {0, pr.linkUnaryCallback}, //iam: musl stuff
340+
341+
}
342+
*/
343+
301344
for len(argList) > 0 {
302345
var elem = argList[0]
303346

@@ -309,7 +352,10 @@ func parse(argList []string) parserResult {
309352
} else {
310353
var listShift = 0
311354
var matched = false
312-
for pattern, fi := range argPatterns {
355+
356+
for _, argPat := range argPatterns {
357+
pattern := argPat.pattern
358+
fi := argPat.finfo
313359
var regExp = regexp.MustCompile(pattern)
314360
if regExp.MatchString(elem) {
315361
fi.handler(elem, argList[1:1+fi.arity])
@@ -318,6 +364,15 @@ func parse(argList []string) parserResult {
318364
break
319365
}
320366
}
367+
//for pattern, fi := range argPatterns {
368+
// var regExp = regexp.MustCompile(pattern)
369+
// if regExp.MatchString(elem) {
370+
// fi.handler(elem, argList[1:1+fi.arity])
371+
// listShift = fi.arity
372+
// matched = true
373+
// break
374+
// }
375+
//}
321376
if !matched {
322377
LogWarning("Did not recognize the compiler flag: %v\n", elem)
323378
pr.compileUnaryCallback(elem, argList[1:1])

0 commit comments

Comments
 (0)