diff options
author | Yifan Hong <elsk@google.com> | 2017-03-09 02:57:48 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2017-03-09 02:57:48 +0000 |
commit | c2b36f56968dd32631a98a8d06e6497d5318c6a2 (patch) | |
tree | c6af2ba88c9124e63373f50a2d22d9bce56eb0e4 /cmds | |
parent | f83403fdd26e5a0e5f315d1aa699e2711ab5990a (diff) | |
parent | 45370128a5749ecc61d5fd3b7850c43b351c03ab (diff) | |
download | native-c2b36f56968dd32631a98a8d06e6497d5318c6a2.tar.gz |
Merge changes from topic 'vintf_arch'
am: 45370128a5
Change-Id: Ia8e62d1a64e5a893b651c46e5872854e2f52034f
Diffstat (limited to 'cmds')
-rw-r--r-- | cmds/lshal/Lshal.cpp | 49 | ||||
-rw-r--r-- | cmds/lshal/TableEntry.h | 4 |
2 files changed, 44 insertions, 9 deletions
diff --git a/cmds/lshal/Lshal.cpp b/cmds/lshal/Lshal.cpp index 9e60461fe1..87501472e2 100644 --- a/cmds/lshal/Lshal.cpp +++ b/cmds/lshal/Lshal.cpp @@ -160,14 +160,14 @@ bool Lshal::getReferencedPids( } void Lshal::forEachTable(const std::function<void(Table &)> &f) { - for (const Table &table : {mServicesTable, mPassthroughRefTable, mImplementationsTable}) { - f(const_cast<Table &>(table)); - } + f(mServicesTable); + f(mPassthroughRefTable); + f(mImplementationsTable); } void Lshal::forEachTable(const std::function<void(const Table &)> &f) const { - for (const Table &table : {mServicesTable, mPassthroughRefTable, mImplementationsTable}) { - f(table); - } + f(mServicesTable); + f(mPassthroughRefTable); + f(mImplementationsTable); } void Lshal::postprocess() { @@ -183,6 +183,26 @@ void Lshal::postprocess() { } } }); + // use a double for loop here because lshal doesn't care about efficiency. + for (TableEntry &packageEntry : mImplementationsTable) { + std::string packageName = packageEntry.interfaceName; + FQName fqPackageName{packageName.substr(0, packageName.find("::"))}; + if (!fqPackageName.isValid()) { + continue; + } + for (TableEntry &interfaceEntry : mPassthroughRefTable) { + if (interfaceEntry.arch != ARCH_UNKNOWN) { + continue; + } + FQName interfaceName{splitFirst(interfaceEntry.interfaceName, '/').first}; + if (!interfaceName.isValid()) { + continue; + } + if (interfaceName.getPackageAndVersion() == fqPackageName) { + interfaceEntry.arch = packageEntry.arch; + } + } + } } void Lshal::printLine( @@ -247,10 +267,25 @@ void Lshal::dumpVintf() const { &table == &mImplementationsTable ? "" : splittedFqInstanceName.second; vintf::Transport transport; + vintf::Arch arch; if (entry.transport == "hwbinder") { transport = vintf::Transport::HWBINDER; + arch = vintf::Arch::ARCH_EMPTY; } else if (entry.transport == "passthrough") { transport = vintf::Transport::PASSTHROUGH; + switch (entry.arch) { + case lshal::ARCH32: + arch = vintf::Arch::ARCH_32; break; + case lshal::ARCH64: + arch = vintf::Arch::ARCH_64; break; + case lshal::ARCH_BOTH: + arch = vintf::Arch::ARCH_32_64; break; + case lshal::ARCH_UNKNOWN: // fallthrough + default: + mErr << "Warning: '" << fqName.package() + << "' doesn't have bitness info, assuming 32+64." << std::endl; + arch = vintf::Arch::ARCH_32_64; + } } else { mErr << "Warning: '" << entry.transport << "' is not a valid transport." << std::endl; continue; @@ -262,7 +297,7 @@ void Lshal::dumpVintf() const { .format = vintf::HalFormat::HIDL, .name = fqName.package(), .impl = {.implLevel = vintf::ImplLevel::GENERIC, .impl = ""}, - .transport = transport + .transportArch = {transport, arch} })) { mErr << "Warning: cannot add hal '" << fqInstanceName << "'" << std::endl; continue; diff --git a/cmds/lshal/TableEntry.h b/cmds/lshal/TableEntry.h index 2407b42cdf..9ae8f7863a 100644 --- a/cmds/lshal/TableEntry.h +++ b/cmds/lshal/TableEntry.h @@ -37,8 +37,8 @@ using TableEntrySource = unsigned int; enum : unsigned int { ARCH_UNKNOWN = 0, - ARCH64 = 1 << 0, - ARCH32 = 1 << 1, + ARCH32 = 1 << 0, + ARCH64 = 1 << 1, ARCH_BOTH = ARCH32 | ARCH64 }; using Architecture = unsigned int; |