[llvm-commits] [llvm] r123294 - in /llvm/trunk: lib/MC/ELFObjectWriter.cpp lib/Target/ARM/ARMAsmBackend.cpp lib/Target/ARM/ARMAsmPrinter.cpp lib/Target/ARM/ARMFixupKinds.h lib/Target/ARM/ARMMCCodeEmitter.cpp test/MC/ARM/elf-movt.s

Jim Grosbach grosbach at apple.com
Wed Jan 12 10:59:40 PST 2011


On Jan 12, 2011, at 10:49 AM, Evan Cheng wrote:

> 
> On Jan 11, 2011, at 4:19 PM, Jason W Kim wrote:
> 
>> 
>> Modified: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp?rev=123294&r1=123293&r2=123294&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp (original)
>> +++ llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp Tue Jan 11 18:19:25 2011
>> @@ -189,10 +189,10 @@
>>    int64_t Imm = MO.getImm();
>>    O << '#';
>>    if ((Modifier && strcmp(Modifier, "lo16") == 0) ||
>> -        (TF == ARMII::MO_LO16))
>> +        (TF & ARMII::MO_LO16))
>>      O << ":lower16:";
>>    else if ((Modifier && strcmp(Modifier, "hi16") == 0) ||
>> -             (TF == ARMII::MO_HI16))
>> +             (TF & ARMII::MO_HI16))
>>      O << ":upper16:";
>>    O << Imm;
>>    break;
> 
> Are these modifiers still being used? I don't see them.
> 

There shouldn't be any uses of the Modifier string left in the ARM backend. If there are, we should fix it. :)

-Jim

> 
>> 
>> Modified: llvm/trunk/lib/Target/ARM/ARMFixupKinds.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMFixupKinds.h?rev=123294&r1=123293&r2=123294&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/ARM/ARMFixupKinds.h (original)
>> +++ llvm/trunk/lib/Target/ARM/ARMFixupKinds.h Tue Jan 11 18:19:25 2011
>> @@ -74,6 +74,11 @@
>>  fixup_arm_movt_hi16, // :upper16:
>>  fixup_arm_movw_lo16, // :lower16:
>> 
>> +  // It is possible to create an "immediate" that happens to be pcrel.
>> +  // Needed to support ELF::R_ARM_MOVT_PREL and ELF::R_ARM_MOVW_PREL_NC
>> +  fixup_arm_movt_hi16_pcrel, // :upper16:
>> +  fixup_arm_movw_lo16_pcrel, // :lower16:
>> +
>>  // Marker
>>  LastTargetFixupKind,
>>  NumTargetFixupKinds = LastTargetFixupKind - FirstTargetFixupKind
>> 
>> Modified: llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp?rev=123294&r1=123293&r2=123294&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp (original)
>> +++ llvm/trunk/lib/Target/ARM/ARMMCCodeEmitter.cpp Tue Jan 11 18:19:25 2011
>> @@ -626,6 +626,32 @@
>>  return Binary;
>> }
>> 
>> +// FIXME: This routine needs to handle more MCExpr types
>> +static const MCSymbolRefExpr *FindLHSymExpr(const MCExpr *E) {
>> +  // recurse left child until finding a MCSymbolRefExpr
>> +  switch (E->getKind()) {
>> +  case MCExpr::SymbolRef:
>> +    return cast<MCSymbolRefExpr>(E);
>> +  case MCExpr::Binary:
>> +    return FindLHSymExpr(cast<MCBinaryExpr>(E)->getLHS());
>> +  default:
>> +    return NULL;
>> +  }
>> +}
>> +
>> +// FIXME: This routine assumes that a binary
>> +// expression will always result in a PCRel expression
>> +// In reality, its only true if one or more subexpressions
>> +// is itself a PCRel (i.e. "." in asm or some other pcrel construct)
>> +// but this is good enough for now.
>> +static bool EvaluateAsPCRel(const MCExpr *Expr) {
>> +  switch (Expr->getKind()) {
>> +  case MCExpr::SymbolRef: return false;
>> +  case MCExpr::Binary: return true;
>> +  default: assert(0 && "Unexpected expression type");
>> +  }
>> +}
>> +
>> uint32_t ARMMCCodeEmitter::
>> getMovtImmOpValue(const MCInst &MI, unsigned OpIdx,
>>                  SmallVectorImpl<MCFixup> &Fixups) const {
>> @@ -635,18 +661,27 @@
>>  if (MO.isImm()) {
>>    return static_cast<unsigned>(MO.getImm());
>>  } else if (const MCSymbolRefExpr *Expr =
>> -             dyn_cast<MCSymbolRefExpr>(MO.getExpr())) {
>> +             FindLHSymExpr(MO.getExpr())) {
>> +    // FIXME: :lower16: and :upper16: should be applicable to
>> +    // to whole expression, not just symbolrefs
>> +    // Until that change takes place, this hack is required to
>> +    // generate working code.
>> +    const MCExpr *OrigExpr = MO.getExpr();
>>    MCFixupKind Kind;
>>    switch (Expr->getKind()) {
>>    default: assert(0 && "Unsupported ARMFixup");
>>    case MCSymbolRefExpr::VK_ARM_HI16:
>>      Kind = MCFixupKind(ARM::fixup_arm_movt_hi16);
>> +      if (EvaluateAsPCRel(OrigExpr)) 
>> +        Kind = MCFixupKind(ARM::fixup_arm_movt_hi16_pcrel);
>>      break;
>>    case MCSymbolRefExpr::VK_ARM_LO16:
>>      Kind = MCFixupKind(ARM::fixup_arm_movw_lo16);
>> +      if (EvaluateAsPCRel(OrigExpr)) 
>> +        Kind = MCFixupKind(ARM::fixup_arm_movw_lo16_pcrel);
>>      break;
>>    }
>> -    Fixups.push_back(MCFixup::Create(0, Expr, Kind));
>> +    Fixups.push_back(MCFixup::Create(0, OrigExpr, Kind));
>>    return 0;
>>  };
>>  llvm_unreachable("Unsupported MCExpr type in MCOperand!");
>> 
>> Modified: llvm/trunk/test/MC/ARM/elf-movt.s
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/elf-movt.s?rev=123294&r1=123293&r2=123294&view=diff
>> ==============================================================================
>> --- llvm/trunk/test/MC/ARM/elf-movt.s (original)
>> +++ llvm/trunk/test/MC/ARM/elf-movt.s Tue Jan 11 18:19:25 2011
>> @@ -1,4 +1,6 @@
>> @ RUN: llvm-mc %s -triple=armv7-linux-gnueabi | FileCheck -check-prefix=ASM %s
>> +@ RUN: llvm-mc %s -triple=armv7-linux-gnueabi -filetype=obj -o - | \
>> +@ RUN:    elf-dump --dump-section-data | FileCheck -check-prefix=OBJ %s
>> 	.syntax unified
>> 	.text
>> 	.globl	barf
>> @@ -12,3 +14,26 @@
>> @ ASM:          movw    r0, :lower16:GOT-(.LPC0_2+8)
>> @ ASM-NEXT:     movt    r0, :upper16:GOT-(.LPC0_2+16)
>> 
>> +@@ make sure that the text section fixups are sane too
>> +@ OBJ:                 '.text'
>> +@ OBJ-NEXT:            'sh_type', 0x00000001
>> +@ OBJ-NEXT:            'sh_flags', 0x00000006
>> +@ OBJ-NEXT:            'sh_addr', 0x00000000
>> +@ OBJ-NEXT:            'sh_offset', 0x00000034
>> +@ OBJ-NEXT:            'sh_size', 0x00000008
>> +@ OBJ-NEXT:            'sh_link', 0x00000000
>> +@ OBJ-NEXT:            'sh_info', 0x00000000
>> +@ OBJ-NEXT:            'sh_addralign', 0x00000004
>> +@ OBJ-NEXT:            'sh_entsize', 0x00000000
>> +@ OBJ-NEXT:            '_section_data', 'f00f0fe3 ec0f4fe3'
>> +
>> +@ OBJ:              Relocation 0x00000000
>> +@ OBJ-NEXT:         'r_offset', 0x00000000
>> +@ OBJ-NEXT:         'r_sym'
>> +@ OBJ-NEXT:         'r_type', 0x0000002d
>> +
>> +@ OBJ:              Relocation 0x00000001
>> +@ OBJ-NEXT:         'r_offset', 0x00000004
>> +@ OBJ-NEXT:         'r_sym'
>> +@ OBJ-NEXT:         'r_type', 0x0000002e
>> +
>> 
>> 
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits





More information about the llvm-commits mailing list