[lld] r194887 - Duplicate code removal.

Rui Ueyama ruiu at google.com
Fri Nov 15 15:28:58 PST 2013


Author: ruiu
Date: Fri Nov 15 17:28:58 2013
New Revision: 194887

URL: http://llvm.org/viewvc/llvm-project?rev=194887&view=rev
Log:
Duplicate code removal.

Modified:
    lld/trunk/lib/ReaderWriter/Native/WriterNative.cpp

Modified: lld/trunk/lib/ReaderWriter/Native/WriterNative.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/Native/WriterNative.cpp?rev=194887&r1=194886&r2=194887&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/Native/WriterNative.cpp (original)
+++ lld/trunk/lib/ReaderWriter/Native/WriterNative.cpp Fri Nov 15 17:28:58 2013
@@ -184,87 +184,49 @@ private:
     // create chunk for defined atom ivar array
     int nextIndex = 0;
     uint32_t nextFileOffset = _headerBufferSize;
-    if ( hasDefines ) {
-      NativeChunk& chd = chunks[nextIndex++];
-      chd.signature = NCS_DefinedAtomsV1;
-      chd.fileOffset = nextFileOffset;
-      chd.fileSize = _definedAtomIvars.size()*sizeof(NativeDefinedAtomIvarsV1);
-      chd.elementCount = _definedAtomIvars.size();
-      nextFileOffset = chd.fileOffset + chd.fileSize;
+    if (hasDefines) {
+      fillChunkHeader(chunks[nextIndex++], nextFileOffset, _definedAtomIvars,
+                      NCS_DefinedAtomsV1);
 
       // create chunk for attributes
-      NativeChunk& cha = chunks[nextIndex++];
-      cha.signature = NCS_AttributesArrayV1;
-      cha.fileOffset = nextFileOffset;
-      cha.fileSize = _attributes.size()*sizeof(NativeAtomAttributesV1);
-      cha.elementCount = _attributes.size();
-      nextFileOffset = cha.fileOffset + cha.fileSize;
+      fillChunkHeader(chunks[nextIndex++], nextFileOffset, _attributes,
+                      NCS_AttributesArrayV1);
     }
 
     // create chunk for undefined atom array
-    if ( hasUndefines ) {
-      NativeChunk& chu = chunks[nextIndex++];
-      chu.signature = NCS_UndefinedAtomsV1;
-      chu.fileOffset = nextFileOffset;
-      chu.fileSize = _undefinedAtomIvars.size() *
-                                            sizeof(NativeUndefinedAtomIvarsV1);
-      chu.elementCount = _undefinedAtomIvars.size();
-      nextFileOffset = chu.fileOffset + chu.fileSize;
-    }
+    if (hasUndefines)
+      fillChunkHeader(chunks[nextIndex++], nextFileOffset, _undefinedAtomIvars,
+                      NCS_UndefinedAtomsV1);
 
     // create chunk for shared library atom array
-    if ( hasSharedLibraries ) {
-      NativeChunk& chsl = chunks[nextIndex++];
-      chsl.signature = NCS_SharedLibraryAtomsV1;
-      chsl.fileOffset = nextFileOffset;
-      chsl.fileSize = _sharedLibraryAtomIvars.size() *
-                                        sizeof(NativeSharedLibraryAtomIvarsV1);
-      chsl.elementCount = _sharedLibraryAtomIvars.size();
-      nextFileOffset = chsl.fileOffset + chsl.fileSize;
-    }
+    if (hasSharedLibraries)
+      fillChunkHeader(chunks[nextIndex++], nextFileOffset,
+                      _sharedLibraryAtomIvars, NCS_SharedLibraryAtomsV1);
 
      // create chunk for shared library atom array
-    if ( hasAbsolutes ) {
-      NativeChunk& chabs = chunks[nextIndex++];
-      chabs.signature = NCS_AbsoluteAtomsV1;
-      chabs.fileOffset = nextFileOffset;
-      chabs.fileSize = _absoluteAtomIvars.size() *
-                                        sizeof(NativeAbsoluteAtomIvarsV1);
-      chabs.elementCount = _absoluteAtomIvars.size();
-      nextFileOffset = chabs.fileOffset + chabs.fileSize;
+    if (hasAbsolutes) {
+      fillChunkHeader(chunks[nextIndex++], nextFileOffset, _absoluteAtomIvars,
+                      NCS_AbsoluteAtomsV1);
 
       // create chunk for attributes
-      NativeChunk& cha = chunks[nextIndex++];
-      cha.signature = NCS_AbsoluteAttributesV1;
-      cha.fileOffset = nextFileOffset;
-      cha.fileSize = _absAttributes.size()*sizeof(NativeAtomAttributesV1);
-      cha.elementCount = _absAttributes.size();
-      nextFileOffset = cha.fileOffset + cha.fileSize;
+      fillChunkHeader(chunks[nextIndex++], nextFileOffset, _absAttributes,
+                      NCS_AbsoluteAttributesV1);
     }
 
     // create chunk for symbol strings
     // pad end of string pool to 4-bytes
-    while ( (_stringPool.size() % 4) != 0 )
+    while ((_stringPool.size() % 4) != 0)
       _stringPool.push_back('\0');
-    NativeChunk& chs = chunks[nextIndex++];
-    chs.signature = NCS_Strings;
-    chs.fileOffset = nextFileOffset;
-    chs.fileSize = _stringPool.size();
-    chs.elementCount = _stringPool.size();
-    nextFileOffset = chs.fileOffset + chs.fileSize;
+    fillChunkHeader(chunks[nextIndex++], nextFileOffset, _stringPool,
+                    NCS_Strings);
 
     // create chunk for references
-    if ( hasReferences ) {
-      NativeChunk& chr = chunks[nextIndex++];
-      chr.signature = NCS_ReferencesArrayV1;
-      chr.fileOffset = nextFileOffset;
-      chr.fileSize = _references.size() * sizeof(NativeReferenceIvarsV1);
-      chr.elementCount = _references.size();
-      nextFileOffset = chr.fileOffset + chr.fileSize;
-    }
+    if (hasReferences)
+      fillChunkHeader(chunks[nextIndex++], nextFileOffset, _references,
+                      NCS_ReferencesArrayV1);
 
     // create chunk for target table
-    if ( hasTargetsTable ) {
+    if (hasTargetsTable) {
       NativeChunk& cht = chunks[nextIndex++];
       cht.signature = NCS_TargetsTable;
       cht.fileOffset = nextFileOffset;
@@ -274,7 +236,7 @@ private:
     }
 
     // create chunk for addend table
-    if ( hasAddendTable ) {
+    if (hasAddendTable) {
       NativeChunk& chad = chunks[nextIndex++];
       chad.signature = NCS_AddendsTable;
       chad.fileOffset = nextFileOffset;
@@ -284,18 +246,23 @@ private:
     }
 
     // create chunk for content
-    if ( hasContent ) {
-      NativeChunk& chc = chunks[nextIndex++];
-      chc.signature = NCS_Content;
-      chc.fileOffset = nextFileOffset;
-      chc.fileSize = _contentPool.size();
-      chc.elementCount = _contentPool.size();
-      nextFileOffset = chc.fileOffset + chc.fileSize;
-    }
+    if (hasContent)
+      fillChunkHeader(chunks[nextIndex++], nextFileOffset, _contentPool,
+                      NCS_Content);
 
     _headerBuffer->fileSize = nextFileOffset;
   }
 
+  template<class T>
+  void fillChunkHeader(NativeChunk &chunk, uint32_t &nextFileOffset,
+                       std::vector<T> data, uint32_t signature) {
+    chunk.signature = signature;
+    chunk.fileOffset = nextFileOffset;
+    chunk.fileSize = data.size() * sizeof(T);
+    chunk.elementCount = data.size();
+    nextFileOffset = chunk.fileOffset + chunk.fileSize;
+  }
+
   // scan header to find particular chunk
   NativeChunk& findChunk(uint32_t signature) {
     const uint32_t chunkCount = _headerBuffer->chunkCount;





More information about the llvm-commits mailing list