Correct the computation of when to add the padding. It is not based on the
authorReid Spencer <rspencer@reidspencer.com>
Fri, 19 Nov 2004 17:08:00 +0000 (17:08 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Fri, 19 Nov 2004 17:08:00 +0000 (17:08 +0000)
member's size. It is based on the oddness/evenness of the file pointer.
This fixes a bug with llvm-ar not being able to read archives produced by
llvm-ranlib when there are members with odd long file name lengths.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@17997 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Archive/ArchiveReader.cpp
lib/Archive/ArchiveWriter.cpp
lib/Bytecode/Archive/ArchiveReader.cpp
lib/Bytecode/Archive/ArchiveWriter.cpp

index c0f0d1569bd7077d4968670a9a0454ab2d32a805..6f9a75ae7aa60ac3eeedc888af34b51028150696 100644 (file)
@@ -227,7 +227,7 @@ Archive::loadArchive() {
       // with it. It doesn't count as the "first file".
       foreignST = mbr;
       At += mbr->getSize();
-      if ((mbr->getSize() & 1) == 1)
+      if ((intptr_t(At) & 1) == 1)
         At++;
     } else if (mbr->isStringTable()) {
       // Simply suck the entire string table into a string
@@ -236,7 +236,7 @@ Archive::loadArchive() {
       // (SVR4 style long names).
       strtab.assign(At,mbr->getSize());
       At += mbr->getSize();
-      if ((mbr->getSize() & 1) == 1)
+      if ((intptr_t(At) & 1) == 1)
         At++;
       delete mbr;
     } else if (mbr->isLLVMSymbolTable()) { 
@@ -247,7 +247,7 @@ Archive::loadArchive() {
       parseSymbolTable(mbr->getData(),mbr->getSize());
       seenSymbolTable = true;
       At += mbr->getSize();
-      if ((mbr->getSize() & 1) == 1)
+      if ((intptr_t(At) & 1) == 1)
         At++;
       delete mbr; // We don't need this member in the list of members.
     } else {
@@ -259,7 +259,7 @@ Archive::loadArchive() {
       }
       members.push_back(mbr);
       At += mbr->getSize();
-      if ((mbr->getSize() & 1) == 1)
+      if ((intptr_t(At) & 1) == 1)
         At++;
     }
   }
@@ -317,7 +317,7 @@ Archive::loadSymbolTable() {
   if (mbr->isForeignSymbolTable()) {
     // Skip the foreign symbol table, we don't do anything with it
     At += mbr->getSize();
-    if ((mbr->getSize() & 1) == 1)
+    if ((intptr_t(At) & 1) == 1)
       At++;
     delete mbr;
 
@@ -330,7 +330,7 @@ Archive::loadSymbolTable() {
     // Process the string table entry
     strtab.assign((const char*)mbr->getData(),mbr->getSize());
     At += mbr->getSize();
-    if ((mbr->getSize() & 1) == 1)
+    if ((intptr_t(At) & 1) == 1)
       At++;
     delete mbr;
     // Get the next one
@@ -342,7 +342,7 @@ Archive::loadSymbolTable() {
   if (mbr->isLLVMSymbolTable()) {
     parseSymbolTable(mbr->getData(),mbr->getSize());
     FirstFile = At + mbr->getSize();
-    if ((mbr->getSize() & 1) == 1)
+    if ((intptr_t(At) & 1) == 1)
       FirstFile++;
   } else {
     // There's no symbol table in the file. We have to rebuild it from scratch
@@ -454,7 +454,7 @@ Archive::findModulesDefiningSymbols(std::set<std::string>& symbols,
 
       // Go to the next file location
       At += mbr->getSize();
-      if ((mbr->getSize() & 1) == 1)
+      if ((intptr_t(At) & 1) == 1)
         At++;
     }
   }
index bd9851eb5989151833e113072013a647ddcd6944..c3c7d12676e0139e245bc317eba8a411303eacda 100644 (file)
@@ -290,7 +290,7 @@ Archive::writeMember(
   ARFile.write(data,fSize);
 
   // Make sure the member is an even length
-  if (ARFile.tellp() % 2 != 0)
+  if (ARFile.tellp() & 1 == 1)
     ARFile << ARFILE_PAD;
 
   // Free the compressed data, if necessary
index c0f0d1569bd7077d4968670a9a0454ab2d32a805..6f9a75ae7aa60ac3eeedc888af34b51028150696 100644 (file)
@@ -227,7 +227,7 @@ Archive::loadArchive() {
       // with it. It doesn't count as the "first file".
       foreignST = mbr;
       At += mbr->getSize();
-      if ((mbr->getSize() & 1) == 1)
+      if ((intptr_t(At) & 1) == 1)
         At++;
     } else if (mbr->isStringTable()) {
       // Simply suck the entire string table into a string
@@ -236,7 +236,7 @@ Archive::loadArchive() {
       // (SVR4 style long names).
       strtab.assign(At,mbr->getSize());
       At += mbr->getSize();
-      if ((mbr->getSize() & 1) == 1)
+      if ((intptr_t(At) & 1) == 1)
         At++;
       delete mbr;
     } else if (mbr->isLLVMSymbolTable()) { 
@@ -247,7 +247,7 @@ Archive::loadArchive() {
       parseSymbolTable(mbr->getData(),mbr->getSize());
       seenSymbolTable = true;
       At += mbr->getSize();
-      if ((mbr->getSize() & 1) == 1)
+      if ((intptr_t(At) & 1) == 1)
         At++;
       delete mbr; // We don't need this member in the list of members.
     } else {
@@ -259,7 +259,7 @@ Archive::loadArchive() {
       }
       members.push_back(mbr);
       At += mbr->getSize();
-      if ((mbr->getSize() & 1) == 1)
+      if ((intptr_t(At) & 1) == 1)
         At++;
     }
   }
@@ -317,7 +317,7 @@ Archive::loadSymbolTable() {
   if (mbr->isForeignSymbolTable()) {
     // Skip the foreign symbol table, we don't do anything with it
     At += mbr->getSize();
-    if ((mbr->getSize() & 1) == 1)
+    if ((intptr_t(At) & 1) == 1)
       At++;
     delete mbr;
 
@@ -330,7 +330,7 @@ Archive::loadSymbolTable() {
     // Process the string table entry
     strtab.assign((const char*)mbr->getData(),mbr->getSize());
     At += mbr->getSize();
-    if ((mbr->getSize() & 1) == 1)
+    if ((intptr_t(At) & 1) == 1)
       At++;
     delete mbr;
     // Get the next one
@@ -342,7 +342,7 @@ Archive::loadSymbolTable() {
   if (mbr->isLLVMSymbolTable()) {
     parseSymbolTable(mbr->getData(),mbr->getSize());
     FirstFile = At + mbr->getSize();
-    if ((mbr->getSize() & 1) == 1)
+    if ((intptr_t(At) & 1) == 1)
       FirstFile++;
   } else {
     // There's no symbol table in the file. We have to rebuild it from scratch
@@ -454,7 +454,7 @@ Archive::findModulesDefiningSymbols(std::set<std::string>& symbols,
 
       // Go to the next file location
       At += mbr->getSize();
-      if ((mbr->getSize() & 1) == 1)
+      if ((intptr_t(At) & 1) == 1)
         At++;
     }
   }
index bd9851eb5989151833e113072013a647ddcd6944..c3c7d12676e0139e245bc317eba8a411303eacda 100644 (file)
@@ -290,7 +290,7 @@ Archive::writeMember(
   ARFile.write(data,fSize);
 
   // Make sure the member is an even length
-  if (ARFile.tellp() % 2 != 0)
+  if (ARFile.tellp() & 1 == 1)
     ARFile << ARFILE_PAD;
 
   // Free the compressed data, if necessary