diff --git a/lib/Target/Mips/MCTargetDesc/MipsELFStreamer.cpp b/lib/Target/Mips/MCTargetDesc/MipsELFStreamer.cpp index c33bc9ae303..cfcb877805a 100644 --- a/lib/Target/Mips/MCTargetDesc/MipsELFStreamer.cpp +++ b/lib/Target/Mips/MCTargetDesc/MipsELFStreamer.cpp @@ -36,6 +36,10 @@ namespace llvm { MCAssembler& MCA = getAssembler(); unsigned EFlags = MCA.getELFHeaderEFlags(); + // TODO: Need to add -mabicalls and -mno-abicalls flags. + // Currently we assume that -mabicalls is the default. + EFlags |= ELF::EF_MIPS_CPIC; + if (Subtarget.inMips16Mode()) EFlags |= ELF::EF_MIPS_ARCH_ASE_M16; else diff --git a/lib/Target/Mips/MipsAsmPrinter.cpp b/lib/Target/Mips/MipsAsmPrinter.cpp index 638001bb458..bab70afd398 100644 --- a/lib/Target/Mips/MipsAsmPrinter.cpp +++ b/lib/Target/Mips/MipsAsmPrinter.cpp @@ -557,6 +557,15 @@ printFCCOperand(const MachineInstr *MI, int opNum, raw_ostream &O, void MipsAsmPrinter::EmitStartOfAsmFile(Module &M) { // FIXME: Use SwitchSection. + // TODO: Need to add -mabicalls and -mno-abicalls flags. + // Currently we assume that -mabicalls is the default. + if (OutStreamer.hasRawTextSupport()) { + OutStreamer.EmitRawText(StringRef("\t.abicalls")); + Reloc::Model RM = Subtarget->getRelocationModel(); + if (RM == Reloc::Static) + OutStreamer.EmitRawText(StringRef("\t.option\tpic0")); + } + // Tell the assembler which ABI we are using if (OutStreamer.hasRawTextSupport()) OutStreamer.EmitRawText("\t.section .mdebug." + diff --git a/test/MC/Mips/abicalls.ll b/test/MC/Mips/abicalls.ll new file mode 100644 index 00000000000..a93ae6d9c66 --- /dev/null +++ b/test/MC/Mips/abicalls.ll @@ -0,0 +1,13 @@ +; +; When the assembler is ready a .s file for it will +; be created. + +; Note that EF_MIPS_CPIC is set by -mabicalls which is the default on Linux +; TODO need to support -mno-abicalls + +; RUN: llc -filetype=asm -mtriple mipsel-unknown-linux -mcpu=mips32 -relocation-model=static %s -o - | FileCheck -check-prefix=CHECK-STATIC %s +; RUN: llc -filetype=asm -mtriple mipsel-unknown-linux -mcpu=mips32 %s -o - | FileCheck -check-prefix=CHECK-PIC %s +; CHECK-STATIC: .abicalls +; CHECK-STATIC-NEXT: pic0 +; CHECK-PIC: .abicalls +; CHECK-PIC-NOT: pic0 diff --git a/test/MC/Mips/elf_eflags.ll b/test/MC/Mips/elf_eflags.ll index 6d16a42aca2..91217bce071 100644 --- a/test/MC/Mips/elf_eflags.ll +++ b/test/MC/Mips/elf_eflags.ll @@ -6,13 +6,16 @@ ; EF_MIPS_NOREORDER (0x00000001) is always on by default currently ; EF_MIPS_PIC (0x00000002) -; EF_MIPS_CPIC (0x00000004) - not tested yet +; EF_MIPS_CPIC (0x00000004) - See note below ; EF_MIPS_ABI2 (0x00000020) - n32 not tested yet ; EF_MIPS_ARCH_32 (0x50000000) ; EF_MIPS_ARCH_64 (0x60000000) ; EF_MIPS_ARCH_32R2 (0x70000000) ; EF_MIPS_ARCH_64R2 (0x80000000) +; Note that EF_MIPS_CPIC is set by -mabicalls which is the default on Linux +; TODO need to support -mno-abicalls + ; RUN: llc -filetype=obj -mtriple mipsel-unknown-linux -mcpu=mips32 -relocation-model=static %s -o - | llvm-readobj -h | FileCheck -check-prefix=CHECK-BE32 %s ; RUN: llc -filetype=obj -mtriple mipsel-unknown-linux -mcpu=mips32 %s -o - | llvm-readobj -h | FileCheck -check-prefix=CHECK-BE32_PIC %s ; RUN: llc -filetype=obj -mtriple mipsel-unknown-linux -mcpu=mips32r2 -relocation-model=static %s -o - | llvm-readobj -h | FileCheck -check-prefix=CHECK-BE32R2 %s @@ -28,37 +31,37 @@ ; RUN: llc -filetype=obj -mtriple mipsel-unknown-linux -mcpu=mips32r2 -mattr=+mips16 -relocation-model=pic %s -o - | llvm-readobj -h | FileCheck -check-prefix=CHECK-LE32R2-MIPS16 %s ; 32(R1) bit with NO_REORDER and static -; CHECK-BE32: Flags [ (0x50001001) +; CHECK-BE32: Flags [ (0x50001005) ; ; 32(R1) bit with NO_REORDER and PIC -; CHECK-BE32_PIC: Flags [ (0x50001003) +; CHECK-BE32_PIC: Flags [ (0x50001007) ; ; 32R2 bit with NO_REORDER and static -; CHECK-BE32R2: Flags [ (0x70001001) +; CHECK-BE32R2: Flags [ (0x70001005) ; ; 32R2 bit with NO_REORDER and PIC -; CHECK-BE32R2_PIC: Flags [ (0x70001003) +; CHECK-BE32R2_PIC: Flags [ (0x70001007) ; ; 32R2 bit MICROMIPS with NO_REORDER and static -; CHECK-BE32R2-MICROMIPS: Flags [ (0x72001001) +; CHECK-BE32R2-MICROMIPS: Flags [ (0x72001005) ; ; 32R2 bit MICROMIPS with NO_REORDER and PIC -;CHECK-BE32R2-MICROMIPS_PIC: Flags [ (0x72001003) +;CHECK-BE32R2-MICROMIPS_PIC: Flags [ (0x72001007) ; ; 64(R1) bit with NO_REORDER and static -; CHECK-BE64: Flags [ (0x60000001) +; CHECK-BE64: Flags [ (0x60000005) ; ; 64(R1) bit with NO_REORDER and PIC -; CHECK-BE64_PIC: Flags [ (0x60000003) +; CHECK-BE64_PIC: Flags [ (0x60000007) ; ; 64R2 bit with NO_REORDER and static -; CHECK-BE64R2: Flags [ (0x80000001) +; CHECK-BE64R2: Flags [ (0x80000005) ; ; 64R2 bit with NO_REORDER and PIC -; CHECK-BE64R2_PIC: Flags [ (0x80000003) +; CHECK-BE64R2_PIC: Flags [ (0x80000007) ; ; 32R2 bit MIPS16 with PIC -; CHECK-LE32R2-MIPS16: Flags [ (0x74001002) +; CHECK-LE32R2-MIPS16: Flags [ (0x74001006) define i32 @main() nounwind { entry: