COFF: Make Chunk::writeTo() const. NFC.

This should improve code readability especially because this function
is called inside parallel_for_each.

llvm-svn: 248103
diff --git a/lld/COFF/Chunks.cpp b/lld/COFF/Chunks.cpp
index 7168a03..ebf35fa 100644
--- a/lld/COFF/Chunks.cpp
+++ b/lld/COFF/Chunks.cpp
@@ -49,7 +49,7 @@
 static void or16(uint8_t *P, uint16_t V) { write16le(P, read16le(P) | V); }
 
 void SectionChunk::applyRelX64(uint8_t *Off, uint16_t Type, Defined *Sym,
-                               uint64_t P) {
+                               uint64_t P) const {
   uint64_t S = Sym->getRVA();
   switch (Type) {
   case IMAGE_REL_AMD64_ADDR32:   add32(Off, S + Config->ImageBase); break;
@@ -69,7 +69,7 @@
 }
 
 void SectionChunk::applyRelX86(uint8_t *Off, uint16_t Type, Defined *Sym,
-                               uint64_t P) {
+                               uint64_t P) const {
   uint64_t S = Sym->getRVA();
   switch (Type) {
   case IMAGE_REL_I386_ABSOLUTE: break;
@@ -110,7 +110,7 @@
 }
 
 void SectionChunk::applyRelARM(uint8_t *Off, uint16_t Type, Defined *Sym,
-                               uint64_t P) {
+                               uint64_t P) const {
   uint64_t S = Sym->getRVA();
   // Pointer to thumb code must have the LSB set.
   if (Sym->isExecutable())
@@ -127,7 +127,7 @@
   }
 }
 
-void SectionChunk::writeTo(uint8_t *Buf) {
+void SectionChunk::writeTo(uint8_t *Buf) const {
   if (!hasData())
     return;
   // Copy section contents from source object file to output file.
@@ -244,7 +244,7 @@
          IMAGE_SCN_MEM_WRITE;
 }
 
-void StringChunk::writeTo(uint8_t *Buf) {
+void StringChunk::writeTo(uint8_t *Buf) const {
   memcpy(Buf + OutputSectionOff, Str.data(), Str.size());
 }
 
@@ -254,7 +254,7 @@
   Align = 16;
 }
 
-void ImportThunkChunkX64::writeTo(uint8_t *Buf) {
+void ImportThunkChunkX64::writeTo(uint8_t *Buf) const {
   memcpy(Buf + OutputSectionOff, ImportThunkX86, sizeof(ImportThunkX86));
   // The first two bytes is a JMP instruction. Fill its operand.
   write32le(Buf + OutputSectionOff + 2, ImpSymbol->getRVA() - RVA - getSize());
@@ -264,7 +264,7 @@
   Res->emplace_back(getRVA() + 2);
 }
 
-void ImportThunkChunkX86::writeTo(uint8_t *Buf) {
+void ImportThunkChunkX86::writeTo(uint8_t *Buf) const {
   memcpy(Buf + OutputSectionOff, ImportThunkX86, sizeof(ImportThunkX86));
   // The first two bytes is a JMP instruction. Fill its operand.
   write32le(Buf + OutputSectionOff + 2,
@@ -275,7 +275,7 @@
   Res->emplace_back(getRVA(), IMAGE_REL_BASED_ARM_MOV32T);
 }
 
-void ImportThunkChunkARM::writeTo(uint8_t *Buf) {
+void ImportThunkChunkARM::writeTo(uint8_t *Buf) const {
   memcpy(Buf + OutputSectionOff, ImportThunkARM, sizeof(ImportThunkARM));
   // Fix mov.w and mov.t operands.
   applyMOV32T(Buf + OutputSectionOff, ImpSymbol->getRVA() + Config->ImageBase);
@@ -289,7 +289,7 @@
   return Config->is64() ? 8 : 4;
 }
 
-void LocalImportChunk::writeTo(uint8_t *Buf) {
+void LocalImportChunk::writeTo(uint8_t *Buf) const {
   if (Config->is64()) {
     write64le(Buf + OutputSectionOff, Sym->getRVA() + Config->ImageBase);
   } else {
@@ -297,7 +297,7 @@
   }
 }
 
-void SEHTableChunk::writeTo(uint8_t *Buf) {
+void SEHTableChunk::writeTo(uint8_t *Buf) const {
   ulittle32_t *Begin = reinterpret_cast<ulittle32_t *>(Buf + OutputSectionOff);
   size_t Cnt = 0;
   for (Defined *D : Syms)
@@ -321,7 +321,7 @@
   }
 }
 
-void BaserelChunk::writeTo(uint8_t *Buf) {
+void BaserelChunk::writeTo(uint8_t *Buf) const {
   memcpy(Buf + OutputSectionOff, Data.data(), Data.size());
 }
 
diff --git a/lld/COFF/Chunks.h b/lld/COFF/Chunks.h
index 521b6be..c3129ef 100644
--- a/lld/COFF/Chunks.h
+++ b/lld/COFF/Chunks.h
@@ -59,7 +59,7 @@
   // beginning of the file. Because this function may use RVA values
   // of other chunks for relocations, you need to set them properly
   // before calling this function.
-  virtual void writeTo(uint8_t *Buf) {}
+  virtual void writeTo(uint8_t *Buf) const {}
 
   // The writer sets and uses the addresses.
   uint64_t getRVA() { return RVA; }
@@ -139,15 +139,15 @@
   SectionChunk(ObjectFile *File, const coff_section *Header);
   static bool classof(const Chunk *C) { return C->kind() == SectionKind; }
   size_t getSize() const override { return Header->SizeOfRawData; }
-  void writeTo(uint8_t *Buf) override;
+  void writeTo(uint8_t *Buf) const override;
   bool hasData() const override;
   uint32_t getPermissions() const override;
   StringRef getSectionName() const override { return SectionName; }
   void getBaserels(std::vector<Baserel> *Res) override;
   bool isCOMDAT() const;
-  void applyRelX64(uint8_t *Off, uint16_t Type, Defined *Sym, uint64_t P);
-  void applyRelX86(uint8_t *Off, uint16_t Type, Defined *Sym, uint64_t P);
-  void applyRelARM(uint8_t *Off, uint16_t Type, Defined *Sym, uint64_t P);
+  void applyRelX64(uint8_t *Off, uint16_t Type, Defined *Sym, uint64_t P) const;
+  void applyRelX86(uint8_t *Off, uint16_t Type, Defined *Sym, uint64_t P) const;
+  void applyRelARM(uint8_t *Off, uint16_t Type, Defined *Sym, uint64_t P) const;
 
   // Called if the garbage collector decides to not include this chunk
   // in a final output. It's supposed to print out a log message to stdout.
@@ -228,7 +228,7 @@
 public:
   explicit StringChunk(StringRef S) : Str(S) {}
   size_t getSize() const override { return Str.size() + 1; }
-  void writeTo(uint8_t *Buf) override;
+  void writeTo(uint8_t *Buf) const override;
 
 private:
   StringRef Str;
@@ -251,7 +251,7 @@
 public:
   explicit ImportThunkChunkX64(Defined *S);
   size_t getSize() const override { return sizeof(ImportThunkX86); }
-  void writeTo(uint8_t *Buf) override;
+  void writeTo(uint8_t *Buf) const override;
 
 private:
   Defined *ImpSymbol;
@@ -262,7 +262,7 @@
   explicit ImportThunkChunkX86(Defined *S) : ImpSymbol(S) {}
   size_t getSize() const override { return sizeof(ImportThunkX86); }
   void getBaserels(std::vector<Baserel> *Res) override;
-  void writeTo(uint8_t *Buf) override;
+  void writeTo(uint8_t *Buf) const override;
 
 private:
   Defined *ImpSymbol;
@@ -273,7 +273,7 @@
   explicit ImportThunkChunkARM(Defined *S) : ImpSymbol(S) {}
   size_t getSize() const override { return sizeof(ImportThunkARM); }
   void getBaserels(std::vector<Baserel> *Res) override;
-  void writeTo(uint8_t *Buf) override;
+  void writeTo(uint8_t *Buf) const override;
 
 private:
   Defined *ImpSymbol;
@@ -286,7 +286,7 @@
   explicit LocalImportChunk(Defined *S) : Sym(S) {}
   size_t getSize() const override;
   void getBaserels(std::vector<Baserel> *Res) override;
-  void writeTo(uint8_t *Buf) override;
+  void writeTo(uint8_t *Buf) const override;
 
 private:
   Defined *Sym;
@@ -299,7 +299,7 @@
 public:
   explicit SEHTableChunk(std::set<Defined *> S) : Syms(S) {}
   size_t getSize() const override { return Syms.size() * 4; }
-  void writeTo(uint8_t *Buf) override;
+  void writeTo(uint8_t *Buf) const override;
 
 private:
   std::set<Defined *> Syms;
@@ -312,7 +312,7 @@
 public:
   BaserelChunk(uint32_t Page, Baserel *Begin, Baserel *End);
   size_t getSize() const override { return Data.size(); }
-  void writeTo(uint8_t *Buf) override;
+  void writeTo(uint8_t *Buf) const override;
 
 private:
   std::vector<uint8_t> Data;
diff --git a/lld/COFF/DLL.cpp b/lld/COFF/DLL.cpp
index 32c1558..40ca5cf 100644
--- a/lld/COFF/DLL.cpp
+++ b/lld/COFF/DLL.cpp
@@ -48,7 +48,7 @@
     return RoundUpToAlignment(Name.size() + 3, 2);
   }
 
-  void writeTo(uint8_t *Buf) override {
+  void writeTo(uint8_t *Buf) const override {
     write16le(Buf + OutputSectionOff, Hint);
     memcpy(Buf + OutputSectionOff + 2, Name.data(), Name.size());
   }
@@ -64,7 +64,7 @@
   explicit LookupChunk(Chunk *C) : HintName(C) {}
   size_t getSize() const override { return ptrSize(); }
 
-  void writeTo(uint8_t *Buf) override {
+  void writeTo(uint8_t *Buf) const override {
     write32le(Buf + OutputSectionOff, HintName->getRVA());
   }
 
@@ -79,7 +79,7 @@
   explicit OrdinalOnlyChunk(uint16_t V) : Ordinal(V) {}
   size_t getSize() const override { return ptrSize(); }
 
-  void writeTo(uint8_t *Buf) override {
+  void writeTo(uint8_t *Buf) const override {
     // An import-by-ordinal slot has MSB 1 to indicate that
     // this is import-by-ordinal (and not import-by-name).
     if (Config->is64()) {
@@ -98,7 +98,7 @@
   explicit ImportDirectoryChunk(Chunk *N) : DLLName(N) {}
   size_t getSize() const override { return sizeof(ImportDirectoryTableEntry); }
 
-  void writeTo(uint8_t *Buf) override {
+  void writeTo(uint8_t *Buf) const override {
     auto *E = (coff_import_directory_table_entry *)(Buf + OutputSectionOff);
     E->ImportLookupTableRVA = LookupTab->getRVA();
     E->NameRVA = DLLName->getRVA();
@@ -160,7 +160,7 @@
     return sizeof(delay_import_directory_table_entry);
   }
 
-  void writeTo(uint8_t *Buf) override {
+  void writeTo(uint8_t *Buf) const override {
     auto *E = (delay_import_directory_table_entry *)(Buf + OutputSectionOff);
     E->Attributes = 1;
     E->Name = DLLName->getRVA();
@@ -223,7 +223,7 @@
 
   size_t getSize() const override { return sizeof(ThunkX64); }
 
-  void writeTo(uint8_t *Buf) override {
+  void writeTo(uint8_t *Buf) const override {
     memcpy(Buf + OutputSectionOff, ThunkX64, sizeof(ThunkX64));
     write32le(Buf + OutputSectionOff + 36, Imp->getRVA() - RVA - 40);
     write32le(Buf + OutputSectionOff + 43, Desc->getRVA() - RVA - 47);
@@ -242,7 +242,7 @@
 
   size_t getSize() const override { return sizeof(ThunkX86); }
 
-  void writeTo(uint8_t *Buf) override {
+  void writeTo(uint8_t *Buf) const override {
     memcpy(Buf + OutputSectionOff, ThunkX86, sizeof(ThunkX86));
     write32le(Buf + OutputSectionOff + 3, Imp->getRVA() + Config->ImageBase);
     write32le(Buf + OutputSectionOff + 8, Desc->getRVA() + Config->ImageBase);
@@ -265,7 +265,7 @@
   explicit DelayAddressChunk(Chunk *C) : Thunk(C) {}
   size_t getSize() const override { return ptrSize(); }
 
-  void writeTo(uint8_t *Buf) override {
+  void writeTo(uint8_t *Buf) const override {
     if (Config->is64()) {
       write64le(Buf + OutputSectionOff, Thunk->getRVA() + Config->ImageBase);
     } else {
@@ -294,7 +294,7 @@
     return sizeof(export_directory_table_entry);
   }
 
-  void writeTo(uint8_t *Buf) override {
+  void writeTo(uint8_t *Buf) const override {
     auto *E = (export_directory_table_entry *)(Buf + OutputSectionOff);
     E->NameRVA = DLLName->getRVA();
     E->OrdinalBase = 0;
@@ -318,7 +318,7 @@
   explicit AddressTableChunk(size_t MaxOrdinal) : Size(MaxOrdinal + 1) {}
   size_t getSize() const override { return Size * 4; }
 
-  void writeTo(uint8_t *Buf) override {
+  void writeTo(uint8_t *Buf) const override {
     for (Export &E : Config->Exports) {
       auto *D = cast<Defined>(E.Sym->repl());
       write32le(Buf + OutputSectionOff + E.Ordinal * 4, D->getRVA());
@@ -334,7 +334,7 @@
   explicit NamePointersChunk(std::vector<Chunk *> &V) : Chunks(V) {}
   size_t getSize() const override { return Chunks.size() * 4; }
 
-  void writeTo(uint8_t *Buf) override {
+  void writeTo(uint8_t *Buf) const override {
     uint8_t *P = Buf + OutputSectionOff;
     for (Chunk *C : Chunks) {
       write32le(P, C->getRVA());
@@ -351,7 +351,7 @@
   explicit ExportOrdinalChunk(size_t I) : Size(I) {}
   size_t getSize() const override { return Size * 2; }
 
-  void writeTo(uint8_t *Buf) override {
+  void writeTo(uint8_t *Buf) const override {
     uint8_t *P = Buf + OutputSectionOff;
     for (Export &E : Config->Exports) {
       if (E.Noname)