43 lines
836 B
Go
43 lines
836 B
Go
|
package pass
|
||
|
|
||
|
import (
|
||
|
"github.com/mmcloughlin/avo/attr"
|
||
|
"github.com/mmcloughlin/avo/ir"
|
||
|
)
|
||
|
|
||
|
// IncludeTextFlagHeader includes textflag.h if necessary.
|
||
|
func IncludeTextFlagHeader(f *ir.File) error {
|
||
|
const textflagheader = "textflag.h"
|
||
|
|
||
|
// Check if we already have it.
|
||
|
for _, path := range f.Includes {
|
||
|
if path == textflagheader {
|
||
|
return nil
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Add it if necessary.
|
||
|
if requirestextflags(f) {
|
||
|
f.Includes = append(f.Includes, textflagheader)
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// requirestextflags returns whether the file uses flags in the textflags.h header.
|
||
|
func requirestextflags(f *ir.File) bool {
|
||
|
for _, s := range f.Sections {
|
||
|
var a attr.Attribute
|
||
|
switch s := s.(type) {
|
||
|
case *ir.Function:
|
||
|
a = s.Attributes
|
||
|
case *ir.Global:
|
||
|
a = s.Attributes
|
||
|
}
|
||
|
if a.ContainsTextFlags() {
|
||
|
return true
|
||
|
}
|
||
|
}
|
||
|
return false
|
||
|
}
|