- switch (Fixup.getKind()) {
- case FirstTargetFixupKind: // reloc_pcrel_4byte
- Reloc.Data.Type = COFF::IMAGE_REL_I386_REL32;
- FixedValue += 4;
- break;
- case FK_Data_4:
- Reloc.Data.Type = COFF::IMAGE_REL_I386_DIR32;
- break;
- default:
- llvm_unreachable("unsupported relocation type");
- }
+ COFF::RelocationTypeX86 Type;
+
+ if (Header.Machine == COFF::IMAGE_FILE_MACHINE_I386) {
+ switch (Fixup.getKind()) {
+ case X86::reloc_pcrel_4byte:
+ Type = COFF::IMAGE_REL_I386_REL32;
+ FixedValue += 4;
+ break;
+ case FK_Data_4:
+ Type = COFF::IMAGE_REL_I386_DIR32;
+ break;
+ default:
+ llvm_unreachable("unsupported relocation type");
+ }
+ } else if (Header.Machine == COFF::IMAGE_FILE_MACHINE_AMD64) {
+ switch (Fixup.getKind()) {
+ case FK_Data_8:
+ Type = COFF::IMAGE_REL_AMD64_ADDR64;
+ break;
+ case X86::reloc_pcrel_4byte:
+ case X86::reloc_riprel_4byte:
+ Type = COFF::IMAGE_REL_AMD64_REL32;
+ FixedValue += 4;
+ break;
+ case FK_Data_4:
+ Type = COFF::IMAGE_REL_AMD64_ADDR32;
+ break;
+ default:
+ llvm_unreachable("unsupported relocation type");
+ }
+ } else
+ llvm_unreachable("unknown target architecture");
+
+ Reloc.Data.Type = Type;