[llvm-commits] [llvm] r143406 - /llvm/trunk/lib/Target/CppBackend/CPPBackend.cpp

Eli Friedman eli.friedman at gmail.com
Mon Oct 31 17:32:23 PDT 2011


On Mon, Oct 31, 2011 at 4:59 PM, Eli Friedman <eli.friedman at gmail.com> wrote:
> Author: efriedma
> Date: Mon Oct 31 18:59:22 2011
> New Revision: 143406
>
> URL: http://llvm.org/viewvc/llvm-project?rev=143406&view=rev
> Log:
> Add support for new atomics to cpp backend.  Misc other fixes while I'm here.  PR11268.

Please take this for 3.0.

-Eli

>
> Modified:
>    llvm/trunk/lib/Target/CppBackend/CPPBackend.cpp
>
> Modified: llvm/trunk/lib/Target/CppBackend/CPPBackend.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/CppBackend/CPPBackend.cpp?rev=143406&r1=143405&r2=143406&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/CppBackend/CPPBackend.cpp (original)
> +++ llvm/trunk/lib/Target/CppBackend/CPPBackend.cpp Mon Oct 31 18:59:22 2011
> @@ -1016,6 +1016,27 @@
>   return result;
>  }
>
> +static StringRef ConvertAtomicOrdering(AtomicOrdering Ordering) {
> +  switch (Ordering) {
> +    case NotAtomic: return "NotAtomic";
> +    case Unordered: return "Unordered";
> +    case Monotonic: return "Monotonic";
> +    case Acquire: return "Acquire";
> +    case Release: return "Release";
> +    case AcquireRelease: return "AcquireRelease";
> +    case SequentiallyConsistent: return "SequentiallyConsistent";
> +  }
> +  llvm_unreachable("Unknown ordering");
> +}
> +
> +static StringRef ConvertAtomicSynchScope(SynchronizationScope SynchScope) {
> +  switch (SynchScope) {
> +    case SingleThread: return "SingleThread";
> +    case CrossThread: return "CrossThread";
> +  }
> +  llvm_unreachable("Unknown synch scope");
> +}
> +
>  // printInstruction - This member is called for each Instruction in a function.
>  void CppWriter::printInstruction(const Instruction *I,
>                                  const std::string& bbname) {
> @@ -1237,15 +1258,33 @@
>     printEscapedString(load->getName());
>     Out << "\", " << (load->isVolatile() ? "true" : "false" )
>         << ", " << bbname << ");";
> +    if (load->getAlignment())
> +      nl(Out) << iName << "->setAlignment("
> +              << load->getAlignment() << ");";
> +    if (load->isAtomic()) {
> +      StringRef Ordering = ConvertAtomicOrdering(load->getOrdering());
> +      StringRef CrossThread = ConvertAtomicSynchScope(load->getSynchScope());
> +      nl(Out) << iName << "->setAtomic("
> +              << Ordering << ", " << CrossThread << ");";
> +    }
>     break;
>   }
>   case Instruction::Store: {
>     const StoreInst* store = cast<StoreInst>(I);
> -    Out << " new StoreInst("
> +    Out << "StoreInst* " << iName << " = new StoreInst("
>         << opNames[0] << ", "
>         << opNames[1] << ", "
>         << (store->isVolatile() ? "true" : "false")
>         << ", " << bbname << ");";
> +    if (store->getAlignment())
> +      nl(Out) << iName << "->setAlignment("
> +              << store->getAlignment() << ");";
> +    if (store->isAtomic()) {
> +      StringRef Ordering = ConvertAtomicOrdering(store->getOrdering());
> +      StringRef CrossThread = ConvertAtomicSynchScope(store->getSynchScope());
> +      nl(Out) << iName << "->setAtomic("
> +              << Ordering << ", " << CrossThread << ");";
> +    }
>     break;
>   }
>   case Instruction::GetElementPtr: {
> @@ -1447,6 +1486,60 @@
>     Out << "\", " << bbname << ");";
>     break;
>   }
> +  case Instruction::Fence: {
> +    const FenceInst *fi = cast<FenceInst>(I);
> +    StringRef Ordering = ConvertAtomicOrdering(fi->getOrdering());
> +    StringRef CrossThread = ConvertAtomicSynchScope(fi->getSynchScope());
> +    Out << "FenceInst* " << iName
> +        << " = new FenceInst(mod->getContext(), "
> +        << Ordering << ", " << CrossThread
> +        << ");";
> +    break;
> +  }
> +  case Instruction::AtomicCmpXchg: {
> +    const AtomicCmpXchgInst *cxi = cast<AtomicCmpXchgInst>(I);
> +    StringRef Ordering = ConvertAtomicOrdering(cxi->getOrdering());
> +    StringRef CrossThread = ConvertAtomicSynchScope(cxi->getSynchScope());
> +    Out << "AtomicCmpXchgInst* " << iName
> +        << " = new AtomicCmpXchgInst("
> +        << opNames[0] << ", " << opNames[1] << ", " << opNames[2] << ", "
> +        << Ordering << ", " << CrossThread
> +        << ");";
> +    nl(Out) << iName << "->setName(\"";
> +    printEscapedString(cxi->getName());
> +    Out << "\");";
> +    break;
> +  }
> +  case Instruction::AtomicRMW: {
> +    const AtomicRMWInst *rmwi = cast<AtomicRMWInst>(I);
> +    StringRef Ordering = ConvertAtomicOrdering(rmwi->getOrdering());
> +    StringRef CrossThread = ConvertAtomicSynchScope(rmwi->getSynchScope());
> +    StringRef Operation;
> +    switch (rmwi->getOperation()) {
> +      case AtomicRMWInst::Xchg: Operation = "AtomicRMWInst::Xchg"; break;
> +      case AtomicRMWInst::Add:  Operation = "AtomicRMWInst::Add"; break;
> +      case AtomicRMWInst::Sub:  Operation = "AtomicRMWInst::Sub"; break;
> +      case AtomicRMWInst::And:  Operation = "AtomicRMWInst::And"; break;
> +      case AtomicRMWInst::Nand: Operation = "AtomicRMWInst::Nand"; break;
> +      case AtomicRMWInst::Or:   Operation = "AtomicRMWInst::Or"; break;
> +      case AtomicRMWInst::Xor:  Operation = "AtomicRMWInst::Xor"; break;
> +      case AtomicRMWInst::Max:  Operation = "AtomicRMWInst::Max"; break;
> +      case AtomicRMWInst::Min:  Operation = "AtomicRMWInst::Min"; break;
> +      case AtomicRMWInst::UMax: Operation = "AtomicRMWInst::UMax"; break;
> +      case AtomicRMWInst::UMin: Operation = "AtomicRMWInst::UMin"; break;
> +      case AtomicRMWInst::BAD_BINOP: llvm_unreachable("Bad atomic operation");
> +    }
> +    Out << "AtomicRMWInst* " << iName
> +        << " = new AtomicRMWInst("
> +        << Operation << ", "
> +        << opNames[0] << ", " << opNames[1] << ", "
> +        << Ordering << ", " << CrossThread
> +        << ");";
> +    nl(Out) << iName << "->setName(\"";
> +    printEscapedString(rmwi->getName());
> +    Out << "\");";
> +    break;
> +  }
>   }
>   DefinedValues.insert(I);
>   nl(Out);
> @@ -1623,7 +1716,9 @@
>       Out << "Value* " << getCppName(AI) << " = args++;";
>       nl(Out);
>       if (AI->hasName()) {
> -        Out << getCppName(AI) << "->setName(\"" << AI->getName() << "\");";
> +        Out << getCppName(AI) << "->setName(\"";
> +        printEscapedString(AI->getName());
> +        Out << "\");";
>         nl(Out);
>       }
>     }
>
>
> _______________________________________________
> 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