[llvm] r309047 - llvm-mt: implement simple merging of manifests, not factoring namespaces.

Eric Beckmann via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 25 16:18:23 PDT 2017


Got it, my fault for forgetting to test in both configurations.  Reverted
for now, fix incoming.

On Tue, Jul 25, 2017 at 4:14 PM, Rui Ueyama via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Eric,
>
> Looks like you forgot to add #if to that particular function, so it is
> failing on bots that doesn't have libxml2.
>
> On Tue, Jul 25, 2017 at 4:07 PM, Sean Callanan via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Eric,
>>
>> this is breaking an LLDB bot:
>>
>> http://lab.llvm.org:8011/builders/lldb-amd64-ninja-freebsd11/builds/12647
>>
>> Could you have a look?
>>
>> Sean
>>
>> On 7/25/17 3:50 PM, Eric Beckmann via llvm-commits wrote:
>>
>> Author: ecbeckmann
>> Date: Tue Jul 25 15:50:25 2017
>> New Revision: 309047
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=309047&view=rev
>> Log:
>> llvm-mt: implement simple merging of manifests, not factoring namespaces.
>>
>> Summary:
>> Does a simple merge, where mergeable elements are combined, all others
>> are appended.  Does not apply trickly namespace rules.
>>
>> Subscribers: llvm-commits, hiraditya
>>
>> Differential Revision: https://reviews.llvm.org/D35753
>>
>> Added:
>>     llvm/trunk/test/tools/llvm-mt/Inputs/additional.manifest
>>     llvm/trunk/test/tools/llvm-mt/Inputs/conflicting.manifest
>>     llvm/trunk/test/tools/llvm-mt/conflicting.test
>>     llvm/trunk/test/tools/llvm-mt/simple_merge.test
>> Modified:
>>     llvm/trunk/include/llvm/Support/WindowsManifestMerger.h
>>     llvm/trunk/lib/Support/WindowsManifestMerger.cpp
>>     llvm/trunk/test/tools/llvm-mt/Inputs/test_manifest.manifest
>>     llvm/trunk/tools/llvm-mt/llvm-mt.cpp
>>
>> Modified: llvm/trunk/include/llvm/Support/WindowsManifestMerger.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/WindowsManifestMerger.h?rev=309047&r1=309046&r2=309047&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Support/WindowsManifestMerger.h (original)
>> +++ llvm/trunk/include/llvm/Support/WindowsManifestMerger.h Tue Jul 25 15:50:25 2017
>> @@ -57,6 +57,8 @@ private:
>>
>>  class WindowsManifestMerger {
>>  public:
>> +  ~WindowsManifestMerger();
>> +
>>    Error merge(const MemoryBuffer &Manifest);
>>
>>    // Returns vector containing merged xml manifest, or uninitialized vector for
>> @@ -68,7 +70,8 @@ private:
>>    Error getParseError();
>>
>>  #if LLVM_LIBXML2_ENABLED
>> -  XMLNodeImpl CombinedRoot = nullptr;
>> +  XMLDocumentImpl CombinedDoc = nullptr;
>> +  std::vector<XMLDocumentImpl> MergedDocs;
>>  #endif
>>    bool ParseErrorOccurred = false;
>>  };
>>
>> Modified: llvm/trunk/lib/Support/WindowsManifestMerger.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/WindowsManifestMerger.cpp?rev=309047&r1=309046&r2=309047&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Support/WindowsManifestMerger.cpp (original)
>> +++ llvm/trunk/lib/Support/WindowsManifestMerger.cpp Tue Jul 25 15:50:25 2017
>> @@ -16,6 +16,11 @@
>>
>>  #include <stdarg.h>
>>
>> +#define TO_XML_CHAR(X) reinterpret_cast<const unsigned char *>(X)
>> +#define FROM_XML_CHAR(X) reinterpret_cast<const char *>(X)
>> +
>> +using namespace llvm;
>> +
>>  namespace llvm {
>>
>>  char WindowsManifestError::ID = 0;
>> @@ -24,16 +29,148 @@ WindowsManifestError::WindowsManifestErr
>>
>>  void WindowsManifestError::log(raw_ostream &OS) const { OS << Msg; }
>>
>> +static bool xmlStringsEqual(const unsigned char *A, const unsigned char *B) {
>> +  return strcmp(FROM_XML_CHAR(A), FROM_XML_CHAR(B)) == 0;
>> +}
>> +
>> +bool isMergeableElement(const unsigned char *ElementName) {
>> +  for (StringRef S : {"application", "assembly", "assemblyIdentity",
>> +                      "compatibility", "noInherit", "requestedExecutionLevel",
>> +                      "requestedPrivileges", "security", "trustInfo"}) {
>> +    if (S == FROM_XML_CHAR(ElementName))
>> +      return true;
>> +  }
>> +  return false;
>> +}
>> +
>> +XMLNodeImpl getChildWithName(XMLNodeImpl Parent,
>> +                             const unsigned char *ElementName) {
>> +#if LLVM_LIBXML2_ENABLED
>> +  for (XMLNodeImpl Child = Parent->children; Child; Child = Child->next)
>> +    if (xmlStringsEqual(Child->name, ElementName)) {
>> +      return Child;
>> +    }
>> +#endif
>> +  return nullptr;
>> +}
>> +
>> +const unsigned char *getAttribute(XMLNodeImpl Node,
>> +                                  const unsigned char *AttributeName) {
>> +#if LLVM_LIBXML2_ENABLED
>> +  for (xmlAttrPtr Attribute = Node->properties; Attribute != nullptr;
>> +       Attribute = Attribute->next) {
>> +    if (xmlStringsEqual(Attribute->name, AttributeName))
>> +      return Attribute->children->content;
>> +  }
>> +#endif
>> +  return nullptr;
>> +}
>> +
>> +Error mergeAttributes(XMLNodeImpl OriginalNode, XMLNodeImpl AdditionalNode) {
>> +#if LLVM_LIBXML2_ENABLED
>> +  for (xmlAttrPtr Attribute = AdditionalNode->properties; Attribute != nullptr;
>> +       Attribute = Attribute->next) {
>> +    if (const unsigned char *OriginalValue =
>> +            getAttribute(OriginalNode, Attribute->name)) {
>> +      // Attributes of the same name must also have the same value.  Otherwise
>> +      // an error is thrown.
>> +      if (!xmlStringsEqual(OriginalValue, Attribute->children->content))
>> +        return make_error<WindowsManifestError>(
>> +            Twine("conflicting attributes for ") +
>> +            FROM_XML_CHAR(OriginalNode->name));
>> +    } else {
>> +      char *NameCopy = strdup(FROM_XML_CHAR(Attribute->name));
>> +      char *ContentCopy = strdup(FROM_XML_CHAR(Attribute->children->content));
>> +      xmlNewProp(OriginalNode, TO_XML_CHAR(NameCopy), TO_XML_CHAR(ContentCopy));
>> +    }
>> +  }
>> +#endif
>> +  return Error::success();
>> +}
>> +
>> +Error treeMerge(XMLNodeImpl OriginalRoot, XMLNodeImpl AdditionalRoot) {
>> +#if LLVM_LIBXML2_ENABLED
>> +  XMLNodeImpl AdditionalFirstChild = AdditionalRoot->children;
>> +  for (XMLNodeImpl Child = AdditionalFirstChild; Child; Child = Child->next) {
>> +    XMLNodeImpl OriginalChildWithName;
>> +    if (!isMergeableElement(Child->name) ||
>> +        !(OriginalChildWithName =
>> +              getChildWithName(OriginalRoot, Child->name))) {
>> +      XMLNodeImpl NewChild = xmlCopyNode(Child, 1);
>> +      if (!NewChild)
>> +        return make_error<WindowsManifestError>(Twine("error when copying ") +
>> +                                                FROM_XML_CHAR(Child->name));
>> +      if (NewChild->ns)
>> +        xmlFreeNs(NewChild->ns); // xmlCopyNode explicitly defines default
>> +                                 // namespace, undo this here.
>> +      if (!xmlAddChild(OriginalRoot, NewChild))
>> +        return make_error<WindowsManifestError>(Twine("could not merge ") +
>> +                                                FROM_XML_CHAR(NewChild->name));
>> +    } else if (auto E = treeMerge(OriginalChildWithName, Child)) {
>> +      return E;
>> +    }
>> +  }
>> +  if (auto E = mergeAttributes(OriginalRoot, AdditionalRoot))
>> +    return E;
>> +#endif
>> +  return Error::success();
>> +}
>> +
>> +void stripCommentsAndText(XMLNodeImpl Root) {
>> +  xmlNode StoreNext;
>> +  for (XMLNodeImpl Child = Root->children; Child; Child = Child->next) {
>> +    if (!xmlStringsEqual(Child->name, TO_XML_CHAR("text")) &&
>> +        !xmlStringsEqual(Child->name, TO_XML_CHAR("comment"))) {
>> +      stripCommentsAndText(Child);
>> +    } else {
>> +      StoreNext.next = Child->next;
>> +      XMLNodeImpl Remove = Child;
>> +      Child = &StoreNext;
>> +      xmlUnlinkNode(Remove);
>> +      xmlFreeNode(Remove);
>> +    }
>> +  }
>> +}
>> +
>> +WindowsManifestMerger::~WindowsManifestMerger() {
>> +#if LLVM_LIBXML2_ENABLED
>> +  for (auto &Doc : MergedDocs)
>> +    xmlFreeDoc(Doc);
>> +#endif
>> +}
>> +
>>  Error WindowsManifestMerger::merge(const MemoryBuffer &Manifest) {
>>  #if LLVM_LIBXML2_ENABLED
>> +  if (Manifest.getBufferSize() == 0)
>> +    return make_error<WindowsManifestError>(
>> +        "attempted to merge empty manifest");
>>    xmlSetGenericErrorFunc((void *)this, WindowsManifestMerger::errorCallback);
>>    XMLDocumentImpl ManifestXML =
>>        xmlReadMemory(Manifest.getBufferStart(), Manifest.getBufferSize(),
>> -                    "manifest.xml", nullptr, 0);
>> +                    "manifest.xml", nullptr, XML_PARSE_NOBLANKS);
>>    xmlSetGenericErrorFunc(nullptr, nullptr);
>>    if (auto E = getParseError())
>>      return E;
>> -  CombinedRoot = xmlDocGetRootElement(ManifestXML);
>> +  XMLNodeImpl AdditionalRoot = xmlDocGetRootElement(ManifestXML);
>> +  stripCommentsAndText(AdditionalRoot);
>> +  if (CombinedDoc == nullptr) {
>> +    CombinedDoc = ManifestXML;
>> +  } else {
>> +    XMLNodeImpl CombinedRoot = xmlDocGetRootElement(CombinedDoc);
>> +    if (xmlStringsEqual(CombinedRoot->name, AdditionalRoot->name) &&
>> +        isMergeableElement(AdditionalRoot->name)) {
>> +      if (auto E = treeMerge(CombinedRoot, AdditionalRoot)) {
>> +        return E;
>> +      }
>> +    } else {
>> +      XMLNodeImpl NewChild = xmlCopyNode(AdditionalRoot, 1);
>> +      if (!NewChild)
>> +        return make_error<WindowsManifestError>("could not copy manifest");
>> +      if (!xmlAddChild(CombinedRoot, NewChild))
>> +        return make_error<WindowsManifestError>("could not append manifest");
>> +    }
>> +  }
>> +  MergedDocs.push_back(ManifestXML);
>>  #endif
>>    return Error::success();
>>  }
>> @@ -42,15 +179,16 @@ std::unique_ptr<MemoryBuffer> WindowsMan
>>  #if LLVM_LIBXML2_ENABLED
>>    unsigned char *XmlBuff;
>>    int BufferSize = 0;
>> -  if (CombinedRoot) {
>> +  if (CombinedDoc) {
>>      std::unique_ptr<xmlDoc> OutputDoc(xmlNewDoc((const unsigned char *)"1.0"));
>> -    xmlDocSetRootElement(OutputDoc.get(), CombinedRoot);
>> -    xmlDocDumpMemory(OutputDoc.get(), &XmlBuff, &BufferSize);
>> +    xmlDocSetRootElement(OutputDoc.get(), xmlDocGetRootElement(CombinedDoc));
>> +    xmlKeepBlanksDefault(0);
>> +    xmlDocDumpFormatMemory(OutputDoc.get(), &XmlBuff, &BufferSize, 1);
>>    }
>>    if (BufferSize == 0)
>>      return nullptr;
>>    return MemoryBuffer::getMemBuffer(
>> -      StringRef(reinterpret_cast<const char *>(XmlBuff), (size_t)BufferSize));
>> +      StringRef(FROM_XML_CHAR(XmlBuff), (size_t)BufferSize));
>>  #else
>>    return nullptr;
>>  #endif
>>
>> Added: llvm/trunk/test/tools/llvm-mt/Inputs/additional.manifest
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-mt/Inputs/additional.manifest?rev=309047&view=auto
>> ==============================================================================
>> --- llvm/trunk/test/tools/llvm-mt/Inputs/additional.manifest (added)
>> +++ llvm/trunk/test/tools/llvm-mt/Inputs/additional.manifest Tue Jul 25 15:50:25 2017
>> @@ -0,0 +1,24 @@
>> +<?xml version="1.0"?>
>> +<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
>> +  <trustInfo>
>> +    <security>
>> +      <requestedPrivileges>
>> +<!--Comment will be removed-->
>> +         <requestedExecutionLevel level="3" admin="false"/>
>> +      </requestedPrivileges>
>> +    </security>
>> +  </trustInfo>
>> +  <dependency>
>> +    <dependentAssembly>
>> +      <assemblyIdentity program="logDisplay"/>
>> +    </dependentAssembly>
>> +  </dependency>
>> +  <compatibility>
>> +    <dependency>
>> +      <assemblyIdentity program="compatibilityCheck2"/>
>> +    </dependency>
>> +    <application>
>> +      <supportedOS Id="BarOS"/>
>> +    </application>
>> +  </compatibility>
>> +</assembly>
>>
>> Added: llvm/trunk/test/tools/llvm-mt/Inputs/conflicting.manifest
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-mt/Inputs/conflicting.manifest?rev=309047&view=auto
>> ==============================================================================
>> --- llvm/trunk/test/tools/llvm-mt/Inputs/conflicting.manifest (added)
>> +++ llvm/trunk/test/tools/llvm-mt/Inputs/conflicting.manifest Tue Jul 25 15:50:25 2017
>> @@ -0,0 +1,10 @@
>> +<?xml version="1.0"?>
>> +<assembly xmlns="urn:schemas-microsoft-com:asm.v1">
>> +  <trustInfo>
>> +    <security>
>> +      <requestedPrivileges>
>> +        <requestedExecutionLevel level="2" uiAccess="1"/>
>> +      </requestedPrivileges>
>> +    </security>
>> +  </trustInfo>
>> +</assembly>
>>
>> Modified: llvm/trunk/test/tools/llvm-mt/Inputs/test_manifest.manifest
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-mt/Inputs/test_manifest.manifest?rev=309047&r1=309046&r2=309047&view=diff
>> ==============================================================================
>> --- llvm/trunk/test/tools/llvm-mt/Inputs/test_manifest.manifest (original)
>> +++ llvm/trunk/test/tools/llvm-mt/Inputs/test_manifest.manifest Tue Jul 25 15:50:25 2017
>> @@ -1,9 +1,9 @@
>>  <?xml version="1.0"?>
>> -<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
>> +<assembly xmlns="urn:schemas-microsoft-com:asm.v1">
>>    <trustInfo>
>>      <security>
>>        <requestedPrivileges>
>> -         <requestedExecutionLevel level="3" uiAccess="1"/>
>> +        <requestedExecutionLevel level="3" uiAccess="1"/>
>>        </requestedPrivileges>
>>      </security>
>>    </trustInfo>
>> @@ -12,4 +12,12 @@
>>        <assemblyIdentity program="displayDriver"/>
>>      </dependentAssembly>
>>    </dependency>
>> +  <compatibility>
>> +    <dependency>
>> +      <assemblyIdentity program="compatibilityCheck1"/>
>> +    </dependency>
>> +    <application>
>> +      <supportedOS Id="FooOS"/>
>> +    </application>
>> +  </compatibility>
>>  </assembly>
>>
>> Added: llvm/trunk/test/tools/llvm-mt/conflicting.test
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-mt/conflicting.test?rev=309047&view=auto
>> ==============================================================================
>> --- llvm/trunk/test/tools/llvm-mt/conflicting.test (added)
>> +++ llvm/trunk/test/tools/llvm-mt/conflicting.test Tue Jul 25 15:50:25 2017
>> @@ -0,0 +1,7 @@
>> +REQUIRES: libxml2
>> +UNSUPPORTED: windows
>> +
>> +RUN: not llvm-mt /manifest %p/Inputs/test_manifest.manifest /manifest \
>> +RUN:   %p/Inputs/conflicting.manifest /out:%t 2>&1 >/dev/null | FileCheck %s
>> +
>> +CHECK: llvm-mt error: conflicting attributes for requestedExecutionLevel
>>
>> Added: llvm/trunk/test/tools/llvm-mt/simple_merge.test
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-mt/simple_merge.test?rev=309047&view=auto
>> ==============================================================================
>> --- llvm/trunk/test/tools/llvm-mt/simple_merge.test (added)
>> +++ llvm/trunk/test/tools/llvm-mt/simple_merge.test Tue Jul 25 15:50:25 2017
>> @@ -0,0 +1,39 @@
>> +REQUIRES: libxml2
>> +UNSUPPORTED: windows
>> +
>> +RUN: llvm-mt /manifest %p/Inputs/test_manifest.manifest /manifest \
>> +RUN:   %p/Inputs/additional.manifest /out:%t
>> +RUN: FileCheck %s -input-file=%t
>> +
>> +CHECK:      <?xml version="1.0"?>
>> +CHECK-NEXT: <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
>> +CHECK-NEXT:   <trustInfo>
>> +CHECK-NEXT:     <security>
>> +CHECK-NEXT:       <requestedPrivileges>
>> +CHECK-NEXT:         <requestedExecutionLevel level="3" uiAccess="1" admin="false"/>
>> +CHECK-NEXT:       </requestedPrivileges>
>> +CHECK-NEXT:     </security>
>> +CHECK-NEXT:   </trustInfo>
>> +CHECK-NEXT:   <dependency>
>> +CHECK-NEXT:     <dependentAssembly>
>> +CHECK-NEXT:       <assemblyIdentity program="displayDriver"/>
>> +CHECK-NEXT:     </dependentAssembly>
>> +CHECK-NEXT:   </dependency>
>> +CHECK-NEXT:   <compatibility>
>> +CHECK-NEXT:     <dependency>
>> +CHECK-NEXT:       <assemblyIdentity program="compatibilityCheck1"/>
>> +CHECK-NEXT:     </dependency>
>> +CHECK-NEXT:     <application>
>> +CHECK-NEXT:       <supportedOS Id="FooOS"/>
>> +CHECK-NEXT:       <supportedOS Id="BarOS"/>
>> +CHECK-NEXT:     </application>
>> +CHECK-NEXT:     <dependency>
>> +CHECK-NEXT:       <assemblyIdentity program="compatibilityCheck2"/>
>> +CHECK-NEXT:     </dependency>
>> +CHECK-NEXT:   </compatibility>
>> +CHECK-NEXT:   <dependency>
>> +CHECK-NEXT:     <dependentAssembly>
>> +CHECK-NEXT:       <assemblyIdentity program="logDisplay"/>
>> +CHECK-NEXT:     </dependentAssembly>
>> +CHECK-NEXT:   </dependency>
>> +CHECK-NEXT: </assembly>
>>
>> Modified: llvm/trunk/tools/llvm-mt/llvm-mt.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-mt/llvm-mt.cpp?rev=309047&r1=309046&r2=309047&view=diff
>> ==============================================================================
>> --- llvm/trunk/tools/llvm-mt/llvm-mt.cpp (original)
>> +++ llvm/trunk/tools/llvm-mt/llvm-mt.cpp Tue Jul 25 15:50:25 2017
>> @@ -95,7 +95,6 @@ int main(int argc, const char **argv) {
>>    SpecificBumpPtrAllocator<char> ArgAllocator;
>>    ExitOnErr(errorCodeToError(sys::Process::GetArgumentVector(
>>        argv_buf, makeArrayRef(argv, argc), ArgAllocator)));
>> -
>>    llvm_shutdown_obj Y; // Call llvm_shutdown() on exit.
>>
>>    CvtResOptTable T;
>>
>>
>> _______________________________________________
>> llvm-commits mailing listllvm-commits at lists.llvm.orghttp://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170725/54351212/attachment.html>


More information about the llvm-commits mailing list