Add support for cc_library_headers to replace llndk_headers

Set llndk.llndk_headers: true to allow a cc_library_headers
module to be used by a cc_library module with llndk.symbol_file set.

Bug: 170784825
Test: TestLlndkHeaders
Change-Id: Ib65a4b70717dc9a54ae30f2991485bb1bb9b8409
diff --git a/cc/cc.go b/cc/cc.go
index 260fcf1..4d8f4e1 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -1135,9 +1135,9 @@
 	return false
 }
 
-func (m *Module) HasLlndkStubs() bool {
+func (m *Module) NeedsLlndkVariants() bool {
 	lib := moduleLibraryInterface(m)
-	return lib != nil && lib.hasLLNDKStubs()
+	return lib != nil && (lib.hasLLNDKStubs() || lib.hasLLNDKHeaders())
 }
 
 // isImplementationForLLNDKPublic returns true for any variant of a cc_library that has LLNDK stubs
diff --git a/cc/image.go b/cc/image.go
index c1e5dfe..6265b13 100644
--- a/cc/image.go
+++ b/cc/image.go
@@ -437,13 +437,13 @@
 		productVndkVersion = platformVndkVersion
 	}
 
-	if m.IsLlndkLibrary() || m.IsLlndkHeaders() || m.HasLlndkStubs() {
+	if m.IsLlndkLibrary() || m.IsLlndkHeaders() || m.NeedsLlndkVariants() {
 		// This is an LLNDK library.  The implementation of the library will be on /system,
 		// and vendor and product variants will be created with LLNDK stubs.
 		// The LLNDK libraries need vendor variants even if there is no VNDK.
 		// The obsolete llndk_library and llndk_headers modules also need the vendor variants
 		// so the cc_library LLNDK stubs can depend on them.
-		if m.HasLlndkStubs() {
+		if m.NeedsLlndkVariants() {
 			coreVariantNeeded = true
 		}
 		if platformVndkVersion != "" {
diff --git a/cc/library.go b/cc/library.go
index af92b24..8f2127e 100644
--- a/cc/library.go
+++ b/cc/library.go
@@ -869,6 +869,7 @@
 
 	implementationModuleName(name string) string
 	hasLLNDKStubs() bool
+	hasLLNDKHeaders() bool
 }
 
 var _ libraryInterface = (*libraryDecorator)(nil)
@@ -1683,6 +1684,12 @@
 	return String(library.Properties.Llndk_stubs) != ""
 }
 
+// hasLLNDKHeaders returns true if this cc_library module has a variant that provides headers
+// to a module that sets llndk.symbol_file.
+func (library *libraryDecorator) hasLLNDKHeaders() bool {
+	return Bool(library.Properties.Llndk.Llndk_headers)
+}
+
 func (library *libraryDecorator) implementationModuleName(name string) string {
 	return name
 }
diff --git a/cc/linkable.go b/cc/linkable.go
index 2fa12f6..8fe0b4a 100644
--- a/cc/linkable.go
+++ b/cc/linkable.go
@@ -112,8 +112,8 @@
 	// IsLlndkLibrary returns true if this module is an LLNDK library module.
 	IsLlndkLibrary() bool
 
-	// HasLlndkStubs returns true if this module has LLNDK stubs.
-	HasLlndkStubs() bool
+	// NeedsLlndkVariants returns true if this module has LLNDK stubs or provides LLNDK headers.
+	NeedsLlndkVariants() bool
 
 	UseVndk() bool
 	MustUseVendorVariant() bool
diff --git a/cc/llndk_library.go b/cc/llndk_library.go
index d05dbce..ad19e47 100644
--- a/cc/llndk_library.go
+++ b/cc/llndk_library.go
@@ -69,6 +69,10 @@
 	// vendor nor product libraries. This effectively hides this module from
 	// non-system modules. Default value is false.
 	Private *bool
+
+	// if true, make this module available to provide headers to other modules that set
+	// llndk.symbol_file.
+	Llndk_headers *bool
 }
 
 type llndkStubDecorator struct {