blob: 244a289e27b668dbff3f9b04343165b0f2f19324 [file] [log] [blame]
// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package fidlgen_cpp
import (
"fmt"
"go.fuchsia.dev/fuchsia/tools/fidl/lib/fidlgen"
)
type HandleInformation struct {
ObjectType string
Rights string
}
func (c *compiler) fieldHandleInformation(val fidlgen.Type) *HandleInformation {
return FieldHandleInformation(val, c.decls)
}
func FieldHandleInformation(val fidlgen.Type, decls fidlgen.DeclInfoMap) *HandleInformation {
for val.ElementType != nil {
val = *val.ElementType
}
if val.Kind == fidlgen.EndpointType {
return &HandleInformation{
ObjectType: "ZX_OBJ_TYPE_CHANNEL",
Rights: "ZX_DEFAULT_CHANNEL_RIGHTS",
}
}
if val.Kind == fidlgen.HandleType {
subtype, ok := handleSubtypeConsts[val.HandleSubtype]
if !ok {
panic(fmt.Sprintf("unknown handle type for const: %v", val))
}
return &HandleInformation{
ObjectType: fmt.Sprintf("ZX_OBJ_TYPE_%s", subtype),
Rights: fmt.Sprintf("0x%x", val.HandleRights),
}
}
return nil
}
var handleSubtypeConsts = map[fidlgen.HandleSubtype]string{
fidlgen.HandleSubtypeBti: "BTI",
fidlgen.HandleSubtypeChannel: "CHANNEL",
fidlgen.HandleSubtypeClock: "CLOCK",
fidlgen.HandleSubtypeCounter: "COUNTER",
fidlgen.HandleSubtypeDebugLog: "DEBUGLOG",
fidlgen.HandleSubtypeEvent: "EVENT",
fidlgen.HandleSubtypeEventpair: "EVENTPAIR",
fidlgen.HandleSubtypeException: "EXCEPTION",
fidlgen.HandleSubtypeFifo: "FIFO",
fidlgen.HandleSubtypeGuest: "GUEST",
fidlgen.HandleSubtypeInterrupt: "INTERRUPT",
fidlgen.HandleSubtypeIob: "IOB",
fidlgen.HandleSubtypeIommu: "IOMMU",
fidlgen.HandleSubtypeJob: "JOB",
fidlgen.HandleSubtypeMsi: "MSI",
fidlgen.HandleSubtypeNone: "NONE",
fidlgen.HandleSubtypePager: "PAGER",
fidlgen.HandleSubtypePmt: "PMT",
fidlgen.HandleSubtypePort: "PORT",
fidlgen.HandleSubtypeProcess: "PROCESS",
fidlgen.HandleSubtypeProfile: "PROFILE",
fidlgen.HandleSubtypeResource: "RESOURCE",
fidlgen.HandleSubtypeSocket: "SOCKET",
fidlgen.HandleSubtypeStream: "STREAM",
fidlgen.HandleSubtypeSuspendToken: "SUSPEND_TOKEN",
fidlgen.HandleSubtypeThread: "THREAD",
fidlgen.HandleSubtypeTimer: "TIMER",
fidlgen.HandleSubtypeVcpu: "VCPU",
fidlgen.HandleSubtypeVmar: "VMAR",
fidlgen.HandleSubtypeVmo: "VMO",
}
// Header names for to use for handles where the name isn't the same as HandleSubtype.
// For any subtype not in this list, string(HandleSubtype) is used instead.
var handleHeaderNames = map[fidlgen.HandleSubtype]string{
fidlgen.HandleSubtypeSuspendToken: "lib/zx/suspend_token.h",
}
// Get the correct header to include in order to use the given handle subtype.
func handleHeaderName(h fidlgen.HandleSubtype) string {
if header, ok := handleHeaderNames[h]; ok {
return header
}
return fmt.Sprintf("lib/zx/%s.h", string(h))
}